Подключитесь к серверу socket.io с сервера Node.js с помощью пакета ws. - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть сервер Node.js, который использует популярный пакет ws для использования веб-сокетов.Я хотел бы использовать эту библиотеку для подключения к стороннему серверу, на котором запущен socket.io.

Если бы я использовал socket.io на моем сервере, код подключения был бы примерно таким:

const socket = socketIo('https://api.example.com/1.0/scores')

Я попытался подключиться к той же службе с помощью пакета ws и изменил URL:

const wsClient = new WebSocket('wss://api.example.com/1.0/scores');

, но это привело к следующему:

Ошибка: неожиданный ответ сервера: 200

Вопрос: Что необходимо сделать, чтобы подключиться к стороннему серверу, на котором запущен socket.io, с сервера, на котором выполняетсяws пакет?

Дополнительная информация:

  • В своих поисках я заметил, что некоторые люди предлагали добавить /socket.io/?EIO=3&transport=websocket в конецURL-адрес.Это не выдает такую ​​же ошибку, как указано выше (> Error: Unexpected server response: 200), и не выдает никакой видимой ошибки, но не работает (данные не получены с удаленного сервера).
  • Использование new WebSocket('ws://api.example.com/1.0/scores?EIO=3&transport=websocket');открытие соединения (через ws) приводит к следующей трассировке стека:

    { Error: Parse Error
        at Socket.socketOnData 
        at emitOne 
        at Socket.emit 
        // ... 
    }
    

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

В socket.io api используются веб-сокеты, но на нем также есть множество других функций, позволяющих выполнять такие действия, как HTTP-рукопожатия, идентификаторы сеансов, и даже при необходимости он может обрабатывать переходы на другие протоколы.

У вас пока есть половина проблемы.Добавляя строку socket.io/?EIO=3&transport=websocket, вы указываете параметры для сервера socket.io для принятия.

EIO=3 указывает номер версии для engine.io, в котором используется socket.io.В этом случае вы говорите, что engine.io version = 3

transport=websocket указывает, какой транспортный протокол использовать.Как я уже говорил ранее, socket.io использует другие протоколы в таких случаях, как аварийное переключение.Эта часть заставляет socket.io использовать websocket в качестве предпочтительного протокола.

Теперь следующая половина - это WebSocket.WebSocket допускает расширения, которые включают в себя различные виды сжатия, которые обычно используются при отправке данных.Я полагаю, именно это и является причиной вашей Parse Error

Попробуйте это ( найдено здесь ):

const WebSocket = require('ws');
const ws = new WebSocket('ws://server/socket.io/?EIO=3&transport=websocket', {
   perMessageDeflate: false
});

Установив perMessageDeflate: false, вы указываете «Несжать данные ".Поскольку, как я уже сказал, это расширение WebSocket, есть и другие варианты.Попробуйте это вместо этого, если он не работает

  • x-webkit-deflate-frame
  • perframe-deflate

Как заявление об отказе от ответственностиисследование, которое я сделал.Я не "специалист по socket.io", поэтому, если что-то не так, пожалуйста, прокомментируйте, и я отредактирую сообщение

0 голосов
/ 29 апреля 2018

Поскольку Socket.IO не гарантирует, что сервер WebSockets будет размещен так, как вы ожидаете, вместо этого вам следует использовать их стандартный клиентский пакет.

npm i socket.io-client

Затем используйте пакет вВаш код:

const ioClient = require('socket.io-client')('https://example.com/1.0/scores')

Полные документы для socket.io-client доступны на их GitHub репо .

Примечание : Честно,хотя на данном этапе лучше использовать WebSockets, если это возможно.WebSockets очень хорошо поддерживается в браузерах и является достаточно стандартным.Socket.IO редко требуется и просто громоздкий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...