annotate seobeo/docs/web_socket_server.md @ 279:b3b547563ec7

Add Google connector service and agent wiki Implement the C/Seobeo Google Drive and Gmail connector with encrypted OAuth storage, Zenbu authentication, browser testing, AI tool discovery, chunked HTTP decoding, and Bazel coverage. Consolidate repository guidance into progressive wiki documentation and enforce arena-first allocation for new first-party C code. Co-authored-by: Copilot <[email protected]> Copilot-Session: 84c338fd-0939-4bb3-b7f3-1062eb213e5d
author MrJuneJune <me@mrjunejune.com>
date Mon, 17 Aug 2026 22:22:36 -0700
parents 7b1719fa918c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
121
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
1 # Seobeo WebSocket Server - Usage Guide
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
2
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
3 A clean, easy-to-use WebSocket server library that integrates seamlessly with the existing Seobeo HTTP server.
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
4
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
5 ## Features
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
6
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
7 1. **Automatic Upgrade Handling**: Automatically detects and upgrades HTTP connections to WebSocket
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
8 2. **Route-Based Handlers**: Register WebSocket handlers for specific paths (like HTTP routing)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
9 3. **Text and Binary Messages**: Send/receive both text and binary data
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
10 4. **Broadcast Support**: Send messages to all connected clients
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
11 5. **Connection Management**: Automatic connection tracking and cleanup
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
12 6. **Integrated with HTTP Server**: Works alongside existing HTTP routes and static file serving
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
13 7. **RFC 6455 Compliant**: Full WebSocket protocol support
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
14
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
15 ## API Overview
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
16
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
17 ### Initialization and Registration
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
18
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
19 ```c
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
20 // Initialize WebSocket server system
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
21 void Seobeo_WebSocket_Server_Init();
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
22
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
23 // Register a WebSocket handler for a specific path
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
24 void Seobeo_WebSocket_Server_Register(const char *path,
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
25 Seobeo_WebSocket_Server_Handler handler, void *p_user_data);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
26 ```
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
27
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
28 ### Handler Function Type
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
29
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
30 ```c
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
31 typedef void (*Seobeo_WebSocket_Server_Handler)(
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
32 Seobeo_WebSocket_Server_Connection *p_conn,
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
33 Seobeo_WebSocket_Message *p_msg,
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
34 void *p_user_data
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
35 );
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
36 ```
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
37
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
38 ### Sending Messages
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
39
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
40 ```c
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
41 // Send to specific client
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
42 int32 Seobeo_WebSocket_Server_Send_Text(Seobeo_WebSocket_Server_Connection *p_conn,
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
43 const char *text);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
44 int32 Seobeo_WebSocket_Server_Send_Binary(Seobeo_WebSocket_Server_Connection *p_conn,
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
45 const uint8 *data, size_t length);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
46
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
47 // Broadcast to all clients
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
48 void Seobeo_WebSocket_Server_Broadcast_Text(const char *text);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
49 void Seobeo_WebSocket_Server_Broadcast_Binary(const uint8 *data, size_t length);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
50 ```
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
51
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
52 ### Connection Management
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
53
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
54 ```c
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
55 // Close specific connection
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
56 void Seobeo_WebSocket_Server_Connection_Close(Seobeo_WebSocket_Server_Connection *p_conn,
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
57 uint16 code, const char *reason);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
58 ```
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
59
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
60 ## Examples
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
61
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
62 ### 1. Simple Echo Server
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
63
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
64 ```c
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
65 #include "seobeo/seobeo.h"
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
66
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
67 void Echo_Handler(Seobeo_WebSocket_Server_Connection *p_conn,
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
68 Seobeo_WebSocket_Message *p_msg, void *p_user_data)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
69 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
70 if (p_msg->opcode == SEOBEO_WS_OPCODE_TEXT)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
71 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
72 printf("Received: %.*s\n", (int)p_msg->length, (char*)p_msg->data);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
73 Seobeo_WebSocket_Server_Send_Text(p_conn, (char*)p_msg->data);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
74 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
75 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
76
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
77 int main()
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
78 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
79 // Initialize WebSocket routing
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
80 Seobeo_WebSocket_Server_Init();
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
81
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
82 // Register echo handler
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
83 Seobeo_WebSocket_Server_Register("/echo", Echo_Handler, NULL);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
84
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
85 // Start HTTP server (automatically handles WebSocket upgrades)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
86 Seobeo_Web_Server_Start(NULL, "8080", SEOBEO_MODE_FORK, 0);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
87
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
88 return 0;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
89 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
90 ```
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
91
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
92 ### 2. Chat Room Server
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
93
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
94 ```c
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
95 void Chat_Handler(Seobeo_WebSocket_Server_Connection *p_conn,
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
96 Seobeo_WebSocket_Message *p_msg, void *p_user_data)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
97 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
98 if (p_msg->opcode == SEOBEO_WS_OPCODE_TEXT)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
99 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
100 char message[2048];
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
101 snprintf(message, sizeof(message), "[%s]: %.*s",
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
102 p_conn->client_id, (int)p_msg->length, (char*)p_msg->data);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
103
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
104 printf("Broadcasting: %s\n", message);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
105 Seobeo_WebSocket_Server_Broadcast_Text(message);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
106 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
107 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
108
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
109 int main()
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
110 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
111 Seobeo_WebSocket_Server_Init();
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
112 Seobeo_WebSocket_Server_Register("/chat", Chat_Handler, NULL);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
113
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
114 printf("Chat server started on ws://localhost:8080/chat\n");
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
115 Seobeo_Web_Server_Start(NULL, "8080", SEOBEO_MODE_FORK, 0);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
116
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
117 return 0;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
118 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
119 ```
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
120
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
121 ### 3. Binary Data Broadcasting
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
122
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
123 ```c
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
124 void Binary_Handler(Seobeo_WebSocket_Server_Connection *p_conn,
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
125 Seobeo_WebSocket_Message *p_msg, void *p_user_data)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
126 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
127 if (p_msg->opcode == SEOBEO_WS_OPCODE_BINARY)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
128 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
129 printf("Received %zu bytes, broadcasting...\n", p_msg->length);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
130 Seobeo_WebSocket_Server_Broadcast_Binary(p_msg->data, p_msg->length);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
131 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
132 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
133
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
134 int main()
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
135 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
136 Seobeo_WebSocket_Server_Init();
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
137 Seobeo_WebSocket_Server_Register("/binary", Binary_Handler, NULL);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
138
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
139 Seobeo_Web_Server_Start(NULL, "8080", SEOBEO_MODE_FORK, 0);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
140 return 0;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
141 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
142 ```
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
143
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
144 ### 4. Multiple Endpoints
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
145
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
146 ```c
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
147 void Echo_Handler(Seobeo_WebSocket_Server_Connection *p_conn,
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
148 Seobeo_WebSocket_Message *p_msg, void *p_user_data)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
149 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
150 if (p_msg->opcode == SEOBEO_WS_OPCODE_TEXT)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
151 Seobeo_WebSocket_Server_Send_Text(p_conn, (char*)p_msg->data);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
152 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
153
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
154 void Chat_Handler(Seobeo_WebSocket_Server_Connection *p_conn,
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
155 Seobeo_WebSocket_Message *p_msg, void *p_user_data)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
156 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
157 if (p_msg->opcode == SEOBEO_WS_OPCODE_TEXT)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
158 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
159 char msg[2048];
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
160 snprintf(msg, sizeof(msg), "[%s]: %.*s",
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
161 p_conn->client_id, (int)p_msg->length, (char*)p_msg->data);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
162 Seobeo_WebSocket_Server_Broadcast_Text(msg);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
163 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
164 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
165
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
166 int main()
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
167 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
168 Seobeo_WebSocket_Server_Init();
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
169
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
170 // Register multiple WebSocket endpoints
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
171 Seobeo_WebSocket_Server_Register("/echo", Echo_Handler, NULL);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
172 Seobeo_WebSocket_Server_Register("/chat", Chat_Handler, NULL);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
173
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
174 printf("Server started with:\n");
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
175 printf(" ws://localhost:8080/echo - Echo server\n");
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
176 printf(" ws://localhost:8080/chat - Chat room\n");
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
177
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
178 Seobeo_Web_Server_Start(NULL, "8080", SEOBEO_MODE_FORK, 0);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
179 return 0;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
180 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
181 ```
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
182
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
183 ### 5. Custom User Data
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
184
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
185 ```c
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
186 typedef struct {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
187 int message_count;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
188 char name[64];
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
189 } ChatRoomData;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
190
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
191 void Chat_Handler_With_Data(Seobeo_WebSocket_Server_Connection *p_conn,
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
192 Seobeo_WebSocket_Message *p_msg, void *p_user_data)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
193 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
194 ChatRoomData *p_data = (ChatRoomData*)p_user_data;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
195
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
196 if (p_msg->opcode == SEOBEO_WS_OPCODE_TEXT)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
197 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
198 p_data->message_count++;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
199
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
200 char message[2048];
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
201 snprintf(message, sizeof(message), "[%s #%d]: %.*s",
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
202 p_data->name, p_data->message_count,
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
203 (int)p_msg->length, (char*)p_msg->data);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
204
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
205 Seobeo_WebSocket_Server_Broadcast_Text(message);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
206 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
207 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
208
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
209 int main()
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
210 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
211 ChatRoomData room_data = {0};
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
212 strcpy(room_data.name, "Main Room");
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
213
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
214 Seobeo_WebSocket_Server_Init();
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
215 Seobeo_WebSocket_Server_Register("/chat", Chat_Handler_With_Data, &room_data);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
216
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
217 Seobeo_Web_Server_Start(NULL, "8080", SEOBEO_MODE_FORK, 0);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
218 return 0;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
219 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
220 ```
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
221
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
222 ### 6. Mixed HTTP and WebSocket Server
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
223
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
224 ```c
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
225 // HTTP route handler
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
226 Seobeo_Request_Entry* Get_Status(Seobeo_Request_Entry *req, Dowa_Arena *arena)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
227 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
228 Seobeo_Request_Entry *resp = NULL;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
229 Dowa_HashMap_Push_Arena(resp, "status", "200", arena);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
230 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
231 Dowa_HashMap_Push_Arena(resp, "body", "{\"status\": \"online\"}", arena);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
232 return resp;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
233 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
234
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
235 // WebSocket handler
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
236 void WS_Handler(Seobeo_WebSocket_Server_Connection *p_conn,
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
237 Seobeo_WebSocket_Message *p_msg, void *p_user_data)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
238 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
239 if (p_msg->opcode == SEOBEO_WS_OPCODE_TEXT)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
240 Seobeo_WebSocket_Server_Send_Text(p_conn, (char*)p_msg->data);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
241 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
242
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
243 int main()
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
244 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
245 // Initialize both HTTP and WebSocket routing
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
246 Seobeo_Router_Init();
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
247 Seobeo_WebSocket_Server_Init();
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
248
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
249 // Register HTTP routes
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
250 Seobeo_Router_Register("GET", "/api/status", Get_Status);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
251
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
252 // Register WebSocket routes
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
253 Seobeo_WebSocket_Server_Register("/ws", WS_Handler, NULL);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
254
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
255 printf("Server started:\n");
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
256 printf(" HTTP: http://localhost:8080/api/status\n");
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
257 printf(" WebSocket: ws://localhost:8080/ws\n");
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
258
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
259 Seobeo_Web_Server_Start("./public", "8080", SEOBEO_MODE_FORK, 0);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
260 return 0;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
261 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
262 ```
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
263
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
264 ## Building
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
265
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
266 ### Build the server example:
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
267 ```bash
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
268 bazel build //seobeo:websocket_server_example
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
269 ```
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
270
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
271 ### Run the server:
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
272 ```bash
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
273 bazel-bin/seobeo/websocket_server_example
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
274 ```
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
275
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
276 ### Test with a client:
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
277 You can test the server using the WebSocket client API or any WebSocket client tool:
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
278 ```bash
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
279 # Using websocat (install: cargo install websocat)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
280 websocat ws://localhost:8080/echo
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
281
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
282 # Using wscat (install: npm install -g wscat)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
283 wscat -c ws://localhost:8080/chat
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
284 ```
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
285
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
286 ## Connection Structure
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
287
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
288 ```c
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
289 struct Seobeo_WebSocket_Server_Connection_Struct {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
290 Seobeo_Handle *p_handle; // Underlying socket handle
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
291 char *client_id; // Unique client identifier
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
292 boolean is_active; // Connection status
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
293
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
294 // Fragment handling (internal)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
295 uint8 *fragment_buffer;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
296 size_t fragment_length;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
297 size_t fragment_capacity;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
298 Seobeo_WebSocket_Opcode fragment_opcode;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
299
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
300 Seobeo_WebSocket_Server_Connection *next; // Linked list
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
301 };
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
302 ```
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
303
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
304 ## Protocol Details
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
305
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
306 The server implementation follows RFC 6455:
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
307
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
308 1. **Handshake**: Responds to HTTP Upgrade requests with proper Sec-WebSocket-Accept key
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
309 2. **Frame Format**: Server sends unmasked frames (RFC requirement)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
310 3. **Frame Receiving**: Server receives and unmasks client frames
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
311 4. **Fragmentation**: Handles fragmented messages automatically
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
312 5. **Control Frames**: Proper handling of ping, pong, and close frames
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
313 6. **Broadcast**: Efficiently sends to all active connections
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
314
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
315 ## Key Differences from Client
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
316
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
317 | Feature | Client | Server |
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
318 |---------|--------|--------|
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
319 | Frame Masking | Masks outgoing frames | Does NOT mask outgoing frames |
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
320 | Connection | Initiates connection | Accepts connections |
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
321 | Upgrade | Sends upgrade request | Responds to upgrade request |
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
322 | Multiple Connections | Single connection | Manages multiple connections |
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
323 | Broadcast | N/A | Can broadcast to all clients |
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
324
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
325 ## Coding Standards
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
326
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
327 The implementation follows your specified coding standards:
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
328 - Naming: `Seobeo_WebSocket_Server_Init`, `Seobeo_WebSocket_Server_Send_Text`
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
329 - Two spaces for indentation
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
330 - New line before `{` unless it's a struct
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
331 - Single statement: no need for `{}`
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
332
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
333 ## Integration with Existing Server
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
334
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
335 The WebSocket server integrates seamlessly:
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
336
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
337 1. **Automatic Detection**: The HTTP server automatically checks for WebSocket upgrade requests
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
338 2. **No Conflicts**: WebSocket and HTTP routes coexist peacefully
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
339 3. **Same Port**: WebSocket and HTTP share the same server port
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
340 4. **Unified Server**: Use `Seobeo_Web_Server_Start()` for everything
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
341
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
342 ## Testing the Server
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
343
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
344 ### JavaScript Client (Browser):
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
345 ```javascript
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
346 const ws = new WebSocket('ws://localhost:8080/echo');
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
347
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
348 ws.onopen = () => {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
349 console.log('Connected!');
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
350 ws.send('Hello, Server!');
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
351 };
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
352
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
353 ws.onmessage = (event) => {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
354 console.log('Received:', event.data);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
355 };
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
356 ```
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
357
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
358 ### Python Client:
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
359 ```python
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
360 import websocket
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
361
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
362 ws = websocket.create_connection("ws://localhost:8080/chat")
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
363 ws.send("Hello from Python!")
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
364 print(ws.recv())
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
365 ws.close()
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
366 ```
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
367
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
368 ## Performance Considerations
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
369
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
370 1. **Fork Mode**: Each connection runs in a separate process (SEOBEO_MODE_FORK)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
371 2. **Edge Mode**: Multi-threaded connections (SEOBEO_MODE_EDGE)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
372 3. **Broadcast**: Iterates through all connections (O(n) complexity)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
373 4. **Fragmentation**: Large messages are automatically fragmented (1MB chunks)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
374
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
375 ## Complete Feature Comparison
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
376
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
377 | Feature | Implemented |
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
378 |---------|-------------|
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
379 | ✅ WebSocket upgrade handshake | Yes |
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
380 | ✅ Text messages | Yes |
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
381 | ✅ Binary messages | Yes |
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
382 | ✅ Message fragmentation | Yes |
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
383 | ✅ Ping/Pong | Yes |
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
384 | ✅ Close handshake | Yes |
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
385 | ✅ Multiple endpoints | Yes |
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
386 | ✅ Broadcast | Yes |
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
387 | ✅ Connection tracking | Yes |
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
388 | ✅ Integration with HTTP server | Yes |
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
389 | ✅ Custom user data per handler | Yes |
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
390
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
391 The Seobeo WebSocket Server provides a complete, production-ready WebSocket implementation that works seamlessly with the existing HTTP server!