annotate seobeo/docs/web_socket_server.md @ 207:58d9b64d8dca

Updated deployment script to include sqlite3
author MrJuneJune <me@mrjunejune.com>
date Sun, 15 Feb 2026 12:25:50 -0800
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!