使用 mongoose 创建双 web/socket 服务器
Creating a dual web/socket server with mongoose
我正在尝试将我使用 Node.js、Express 和 Socket.io 构建的示例移植到 mongoose 中——但我无法让创建的服务器响应两个 WebSocket连接和通用 HTTP 请求。
我首先从 mongoose 复制 web_server 示例,它只是创建了一个 HTTP 服务器。在此示例中,第 384 行调用了 mg_create_server(NULL, EV_HANDLER)
,其中 EV_HANDLER
实际上是 NULL —— 因此所有对服务器的 HTTP 请求都如您所期望的那样恰当地映射到 "document_root"。 到目前为止,还不错。
但是,当我查看 mongoose 附带的各种 WebSocket 示例时,我看到 mg_create_server(server, handler)
调用定义了一个实际的处理程序方法——类似于这样:
static int ev_handler(struct mg_connection *conn, enum mg_event ev) {
switch (ev) {
case MG_REQUEST:
if (conn->is_websocket) {
handle_websocket_message(conn);
return MG_TRUE;
}
else {
mg_send_file(conn, "index.html", NULL); // Return MG_MORE after!
return MG_MORE;
}
case MG_WS_CONNECT:
// New websocket connection. Send connection ID back to the client.
conn->connection_param = calloc(1, sizeof(struct conn_data));
mg_websocket_printf(conn, WEBSOCKET_OPCODE_TEXT, "id %p", conn);
return MG_FALSE;
case MG_CLOSE:
free(conn->connection_param);
return MG_TRUE;
case MG_AUTH:
return MG_TRUE;
default:
return MG_FALSE;
}
}
在这些示例中,MG_REQUEST
案例手动 returns "index.html" 用于 任何不是来自 WebSocket 的请求...非常适合简单示例,但它无法帮助我理解如何在同一台服务器上托管网站和套接字连接。
我尝试简单地将 WebSocket 示例中的 ev_handler
方法移植到 "web_server" 示例中,但是 HTTP 请求似乎只是挂起并且永远不会解析。
如有任何帮助,我们将不胜感激!
有几种方法可以解决这个问题:
修正你的例子。改变这个
mg_send_file(conn, "index.html", NULL);
return MG_MORE;
至此
return MG_FALSE;
不要忘记设置 "document_root" 选项。
使用 fossa - 这是同一供应商 (Cesanta) 的库。 Fossa是Mongoose的超集,更加丰富清晰API。 Fossa 对纯 HTTP 和 Websocket 请求使用不同的事件。这是一个例子:https://github.com/cesanta/fossa/blob/master/examples/websocket_chat/websocket_chat.c
我正在尝试将我使用 Node.js、Express 和 Socket.io 构建的示例移植到 mongoose 中——但我无法让创建的服务器响应两个 WebSocket连接和通用 HTTP 请求。
我首先从 mongoose 复制 web_server 示例,它只是创建了一个 HTTP 服务器。在此示例中,第 384 行调用了 mg_create_server(NULL, EV_HANDLER)
,其中 EV_HANDLER
实际上是 NULL —— 因此所有对服务器的 HTTP 请求都如您所期望的那样恰当地映射到 "document_root"。 到目前为止,还不错。
但是,当我查看 mongoose 附带的各种 WebSocket 示例时,我看到 mg_create_server(server, handler)
调用定义了一个实际的处理程序方法——类似于这样:
static int ev_handler(struct mg_connection *conn, enum mg_event ev) {
switch (ev) {
case MG_REQUEST:
if (conn->is_websocket) {
handle_websocket_message(conn);
return MG_TRUE;
}
else {
mg_send_file(conn, "index.html", NULL); // Return MG_MORE after!
return MG_MORE;
}
case MG_WS_CONNECT:
// New websocket connection. Send connection ID back to the client.
conn->connection_param = calloc(1, sizeof(struct conn_data));
mg_websocket_printf(conn, WEBSOCKET_OPCODE_TEXT, "id %p", conn);
return MG_FALSE;
case MG_CLOSE:
free(conn->connection_param);
return MG_TRUE;
case MG_AUTH:
return MG_TRUE;
default:
return MG_FALSE;
}
}
在这些示例中,MG_REQUEST
案例手动 returns "index.html" 用于 任何不是来自 WebSocket 的请求...非常适合简单示例,但它无法帮助我理解如何在同一台服务器上托管网站和套接字连接。
我尝试简单地将 WebSocket 示例中的 ev_handler
方法移植到 "web_server" 示例中,但是 HTTP 请求似乎只是挂起并且永远不会解析。
如有任何帮助,我们将不胜感激!
有几种方法可以解决这个问题:
修正你的例子。改变这个
mg_send_file(conn, "index.html", NULL); return MG_MORE;
至此
return MG_FALSE;
不要忘记设置 "document_root" 选项。
使用 fossa - 这是同一供应商 (Cesanta) 的库。 Fossa是Mongoose的超集,更加丰富清晰API。 Fossa 对纯 HTTP 和 Websocket 请求使用不同的事件。这是一个例子:https://github.com/cesanta/fossa/blob/master/examples/websocket_chat/websocket_chat.c