Несколько серверов socket.io, совместно использующих один HTTP / S-сервер - PullRequest
0 голосов
/ 02 февраля 2020

С ws, Node.js библиотекой WebSocket можно иметь несколько серверов, совместно использующих один HTTP / S-сервер .

Можно ли сделать то же самое с socket.io ?

Мне нужно иметь два сервера WebSocket на одном HTTP-сервере, один для socket.io и другой для подписок Apollo. Я могу настроить сервер подписки Apollo с сервером Websocket, но не для 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.

1 Ответ

1 голос
/ 03 февраля 2020

Вы можете иметь два сервера socket.io, подключенных к одному веб-серверу. Чтобы это работало, каждый экземпляр socket.io должен иметь свой путь (один может быть путем по умолчанию, а другой - произвольным). Это означает, что вам нужно установить параметр path на клиенте socket.io и на сервере socket.io, чтобы он соответствовал одному из серверов.

Имейте в виду, что путь по умолчанию для клиента и сервера (если вы ничего не указываете) для socket.io равен /socket.io, и поэтому он отвечает на /socket.io/socket.io.js, чтобы дать клиенту код клиента socket.io. Итак, если вы измените путь на обоих, вам нужно будет настроить способ получения клиентом своего кода socket.io.

Вот do c для установки пути на стороне сервера: https://socket.io/docs/server-api/ и вот на стороне клиента выполните c: https://socket.io/docs/client-api/#With -custom-path .


Если вы действительно просто хотите отделить входящие Соединения с socket.io, но на самом деле не обязательно иметь два отдельных экземпляра сервера socket.io, это можно сделать с помощью пространств имен socket.io. Каждый клиент будет подключаться к отдельному пространству имен (которое работает как путь, но на самом деле это не путь), и тогда вы можете иметь отдельных прослушивателей на стороне сервера для входящих соединений в каждом пространстве имен. Это функция, которую socket.io добавляет поверх webSocket именно для таких случаев.

...