Socket.io-client: Транспорт по умолчанию использует опрос вместо веб-сокета?

Созданный на 11 сент. 2015  ·  9Комментарии  ·  Источник: socketio/socket.io-client

Строка 1613 файла socket.io.js гласит:
this.transports = opts.transports || ['опрос', 'веб-сокет'];

Почему не порядок ['websocket', 'polling']?

На стороне клиента делаю:
var socket = io.connect (url);

Затем на стороне сервера я сделал:
io.on ('соединение', функция (сокет) {
console.log (сокет);
});

Часть рукопожатия выглядит так:

handshake: 
   { headers: 
      { 'user-agent': 'node-XMLHttpRequest',
        accept: '*/*',
        host: 'localhost:8081',
        connection: 'close' },
     time: 'Fri Sep 11 2015 16:04:39 GMT-0400 (EDT)',
     address: '::ffff:127.0.0.1',
     xdomain: false,
     secure: false,
     issued: 1442001879771,
     url: '/socket.io/?EIO=3&transport=polling&t=1442001879749-0&b64=1',
     query: { EIO: '3', transport: 'polling', t: '1442001879749-0', b64: '1' } }

Означает ли это, что вместо веб-сокета используется опрос?

Я попытался явно установить транспорт на 'websocket', и часть рукопожатия изменилась на следующее, что кажется правильным:
var socket = io.connect (url, {транспорты: ['websocket']});

handshake: 
   { headers: 
      { connection: 'Upgrade',
        upgrade: 'websocket',
        host: 'localhost:8081',
        origin: 'localhost:8081',
        'sec-websocket-version': '13',
        'sec-websocket-key': 'MTMtMTQ0MjAwMTUxNDcyNA==' },
     time: 'Fri Sep 11 2015 15:58:34 GMT-0400 (EDT)',
     address: '::ffff:127.0.0.1',
     xdomain: true,
     secure: false,
     issued: 1442001514739,
     url: '/socket.io/?EIO=3&transport=websocket',
     query: { EIO: '3', transport: 'websocket' } }

Самый полезный комментарий

+1
Я предпочитаю "понизить версию" вместо "обновления". В настоящее время большинство браузеров хорошо поддерживают websocket. Первоначальное соединение с websocket повысит производительность и сэкономит ресурсы.

Все 9 Комментарий

+1
Я предпочитаю "понизить версию" вместо "обновления". В настоящее время большинство браузеров хорошо поддерживают websocket. Первоначальное соединение с websocket повысит производительность и сэкономит ресурсы.

Причина появления upgrade следующая.

Socket.IO никогда не предполагает, что WebSocket будет просто работать, потому что на практике велика вероятность, что это не так. Вместо этого он сразу же устанавливает соединение с XHR или JSONP, а затем пытается обновить соединение до WebSocket. По сравнению с резервным методом, который полагается на тайм-ауты, это означает, что ни у одного из ваших пользователей не будет ухудшения работы.

http://socket.io/blog/introduction-socket-io-1-0/

@nkzawa
Я понимаю, почему предпочтение отдается обновлению, и это очень приятная функция.
Но это не всегда необходимо: в контролируемых корпоративных средах подход к переходу на более раннюю версию имеет больше смысла, и я бы сказал, что принудительное использование веб-сокета в качестве единственного разрешенного транспорта является лучшим способом оптимизации производительности.

Я попытался принудительно передать транспорт в веб-сокет как на клиенте, так и на сервере, передав эту опцию:
{ transports: ["websocket"] }

Кажется, это работает, и у меня есть только одно соединение с сервером через веб-сокет, но я заметил, что также выполняется опрос, который, очевидно, не работает при каждой попытке:
Request URL:http://localhost:4000/socket.io/?EIO=3&transport=polling&t=L8RaD0p
{ code: 0, message: "Transport unknown" }

Есть ли на данный момент какое-либо жизнеспособное решение для изменения этого подхода к обновлению на более раннюю версию?

Неважно, это был мой код, который выполнял этот дополнительный опрос из другого класса, где я также использовал socket.io. Таким образом, использование opts, которое ограничивает транспорты в веб-сокет при подключении, делает то, что я хотел.

@sirudog
Вы можете попробовать следующее: {транспорты: ['websocket', 'polling']}

Спасибо @ poppowerlb2 (больше нет трафика, как он, в моей вкладке сети). Даже если мой браузер обновлен, я вижу, что socket-io-client предпочитает опрос.

Разве этот подход к обновлению не исключает некоторые серверы? Я пытаюсь использовать socket.io с сервером node-red, но пока не могу установить соединение. Конечно, он отлично работает с простыми веб-сокетами.

Я также думаю, что предпочтительно, чтобы socket.io пробовал использовать веб-сокеты, даже если опрос не работает.

+1
Я предпочитаю "понизить версию" вместо "обновления". В настоящее время большинство браузеров хорошо поддерживают websocket. Первоначальное соединение с websocket повысит производительность и сэкономит ресурсы.

`
const client = io ('https://io.yourhost.com', {// ВНИМАНИЕ: в этом случае нет возврата к транспорту с длинным опросом: ['websocket'] // или ['websocket', ' опрос '], что одно и то же})

https://socket.io/docs/using-multiple-nodes/
`

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

Tiboonn picture Tiboonn  ·  6Комментарии

catamphetamine picture catamphetamine  ·  3Комментарии

yesterday24 picture yesterday24  ·  4Комментарии

zappfinger picture zappfinger  ·  5Комментарии

BorntraegerMarc picture BorntraegerMarc  ·  4Комментарии