1

我正在尝试将使用 Node.js、Express 和 Socket.io 构建的示例移植到 mongoose 中——但我无法让创建的服务器同时响应 WebSocket 连接和通用 HTTP 请求。

我首先从 mongoose 复制web_server示例,它只是创建了一个 HTTP 服务器。在这个例子中,第 384 行调用mg_create_server(NULL, EV_HANDLER)whereEV_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;
    }
}

在这些示例中,案例手动为任何不是来自 WebSocket 的请求MG_REQUEST返回“index.html” ......非常适合简单的示例,但它并不能帮助我理解如何在同一台服务器。

我尝试简单地将ev_handlerWebSocket 示例中的方法移植到“web_server”示例中,但 HTTP 请求似乎只是挂起并且永远不会解决。

任何帮助,将不胜感激!

4

1 回答 1

1

有几种方法可以处理:

  1. 修复您的示例。改变这个

    mg_send_file(conn, "index.html", NULL);
    return MG_MORE;
    

    对此

    return MG_FALSE;
    

    不要忘记设置“document_root”选项。

  2. 使用 fossa - 这是由同一供应商 (Cesanta) 提供的库。Fossa 是 Mongoose 的超集,API 更丰富更清晰。Fossa 对普通 HTTP 和 Websocket 请求使用不同的事件。这是一个例子:https ://github.com/cesanta/fossa/blob/master/examples/websocket_chat/websocket_chat.c

于 2015-04-23T15:01:58.580 回答