Mercurial
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 |
| 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! |