【问题标题】:Multiple socket.io servers sharing a single HTTP/S server多个 socket.io 服务器共享一个 HTTP/S 服务器
【发布时间】:2020-02-02 19:39:23
【问题描述】:

使用ws,Node.js WebSocket库,可以有multiple servers sharing a single HTTP/S server

socket.io 可以做同样的事情吗?

我需要在同一个 HTTP 服务器上有两台 WebSocket 服务器,一台用于 socket.io,另一台用于 Apollo 订阅。我可以用 Websocket 服务器设置 Apollo 订阅服务器,但不能用于 socket.io,socket.io 只接受 HTTP 服务器。

我想这样做:

    const socketioWsS = new WebSocket.Server({ noServer: true });
    const graphqlWsS = new WebSocket.Server({ noServer: true });

    const io = socketIo(socketioWsS, {
      transports: ["websocket"]
    });

    server.on("upgrade", function upgrade(request, socket, head) {
      const pathname = url.parse(request.url).pathname;

      if (pathname === "/socket.io/") {
        socketioWsS.handleUpgrade(request, socket, head, function done(ws) {
          socketioWsS.emit("connection", ws, request);
        });
      } else if (pathname === "/graphql") {
        graphqlWsS.handleUpgrade(request, socket, head, function done(ws) {
          graphqlWsS.emit("connection", ws, request);
        });
      } else {
        socket.destroy();
      }
    });

    server.listen(config.app.port, () => {
      ...

      new SubscriptionServer(
        {
          execute,
          subscribe,
          schema
        },
        {
          server: graphqlWsS
        }
      );
    });

它适用于 Graphql 订阅,但不适用于 socket.io。

【问题讨论】:

  • 你不只是将服务器实例传递为shown in the docs吗?这不适用于 socket.io 服务器的多个实例吗?

标签: node.js websocket socket.io graphql ws


【解决方案1】:

您可以将两个 socket.io 服务器连接到同一个 Web 服务器。为了使其工作,每个 socket.io 实例需要位于不同的路径上(一个可以是默认路径,一个可以是自定义路径)。这意味着您需要在 socket.io 客户端和 socket.io 服务器中设置 path 选项以匹配其中一台服务器。

请记住,socket.io 在客户端和服务器(如果您没有指定任何内容)中的默认路径是/socket.io,这就是为什么它响应/socket.io/socket.io.js 给客户端socket.io客户端代码。因此,如果您更改两者的路径,您将不得不调整客户端获取其 socket.io 代码的方式。

这是在服务器端设置路径的文档:https://socket.io/docs/server-api/,这是客户端文档:https://socket.io/docs/client-api/#With-custom-path


如果您真的只是想分离传入的 socket.io 连接,但不必有两个单独的 socket.io 服务器实例,您可以使用 socket.io 命名空间来做到这一点。每个客户端都将连接到不同的命名空间(其工作方式类似于路径,但它不是真正的路径),然后您可以在服务器端为每个命名空间上的传入连接设置单独的侦听器。这是 socket.io 在 webSocket 之上添加的一个特性,正是针对这种情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-18
    • 2015-08-29
    • 1970-01-01
    相关资源
    最近更新 更多