NodeJS 多个socket.io服务器共享一个HTTP/S服务器

8hhllhi2  于 2022-11-22  发布在  Node.js
关注(0)|答案(1)|浏览(276)

使用ws,Node.js WebSocket库,可以让多个服务器共享一个HTTP/S服务器。
是否可以对www.example.com执行同样的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。

dy1byipe

dy1byipe1#

您可以将两个socket.io服务器连接到同一个Web服务器。要使其正常工作,每个socket.io示例需要位于不同的路径(一个可以是默认路径,另一个可以是自定义路径)。这意味着您需要在socket.io客户端和socket.io服务器中设置path选项,以匹配其中一个服务器。
请记住,www.example.com在客户端和服务器端的默认路径(如果您没有指定任何内容)socket.io都是/socket.io,这就是它响应/socket.io/socket.io.js以向客户端提供socket.io客户端代码的原因。因此,如果您更改了两者的路径,则必须调整客户端获取其socket.io代码的方式。
下面是在服务器端设置路径的文档:https://socket.io/docs/v4/server-api/,下面是客户端文档:https://socket.io/docs/v4/client-api/#With-custom-path。
如果您真的只想分离出传入的socket.io连接,但并不一定要有两个单独的socket.io服务器示例,那么可以使用socket.io名称空间来实现这一点。(其工作方式类似于路径,但它实际上不是一个路径),然后您可以在服务器端为每个名称空间上的传入连接使用单独的侦听器。io在WebSocket之上添加了一个插件,正是为了解决这种情况。

相关问题