Chrome и Safari возвращаются к xhr-опросу, а не к веб-сокетам с socket.io - PullRequest
22 голосов
/ 08 июня 2011

У меня проблема с websockets и socket.io.Когда я пытаюсь подключиться к моему серверу узлов с помощью socket.io, он первоначально подключается с помощью веб-сокетов, но вскоре после этого возвращается к jsonp-опросу.

Это вывод сервера узлов при подключении:

8 Jun 07:01:15 - Initializing client with transport "websocket"
8 Jun 07:01:19 - Initializing client with transport "jsonp-polling"
8 Jun 07:01:19 - Client 16630339180119336 connected

Это происходит в Chrome и Safari.Я обновился до последней версии socket.io 0.6.17 и использую узел 0.4.7.

Я попытался удалить свои файлы cookie и кэш, как это предлагается в github и SO, однако проблема остается.Кроме того, когда я пытаюсь форсировать веб-сокеты, он никогда полностью не соединяется с идентификатором сессии.

У кого-нибудь есть идеи?

1 Ответ

13 голосов
/ 25 июля 2011

Websocket API не поддерживается по умолчанию во всех браузерах на данный момент (насколько мне известно), он должен работать на Chromium, хотя попробуйте протестировать его на Chromium или Firefox (после редактирования настроек по умолчанию) и посмотреть, не переходит ли он к XHRPolling.

Я запускаю его на другом IP, так как мне нужно запустить узел на порту 80, что вызывает конфликт на моем веб-сервере с Apache. Разве веб-сокеты / flashsockets не могут использоваться кросс-домен?

Теперь здесь может быть две разные причины ошибки

  1. Разъемы Web / Flash не позволят вам подключиться к клиенту node.js, если вы не укажете другой порт, такой как 81, или специально не укажете apache для передачи входящего запроса на узел. простое решение - написать HTTP-сервер на базе Node.js для простой передачи данных из Apache (и настроить Apache для запуска на другом порту, отличном от 80)

    Эта ссылка рассказывает, как это сделать ... в этом процессе вы можете заставить Node.js сделать что-то вроде проверки, поступает ли запрос от websocket / httpbrowser, если браузер http перенаправляет запрос на Apache, если нет, т.е. если это из веб / флеш-сокетов, то обрабатывайте сокет соответствующим образом или как прокомментировал вопрос. Укажите APACHE для прокси для Node.js.

  2. Flashsockets требует от вас предоставления файла политики междоменного доступа на порт 843. Вы уверены, что предоставляете файл междоменного домена? (Я думаю, что для этого в socket.io есть встроенная функциональность, но всегда полезно проверять.)

Как сказано на основном сайте socket.io

Чтобы обеспечить подключение в реальном времени для каждого браузера, Socket.IO выбирает наиболее эффективный транспорт во время выполнения, не затрагивая API.

  • WebSocket
  • Adobe® Flash® Socket
  • AJAX длинный опрос
  • AJAX многочастная потоковая передача
  • Навсегда Iframe
  • JSONP Polling

Совершенно очевидно, что он вернется к AJAX Long Polling, если веб-сокеты отключены и Adobe Flash Socket не сможет подключиться (это может быть связано с недоступностью файла политики).

Вот пример кода для междоменного файла, который вы можете включить в свой код и посмотреть, заставляет ли ваш сервер работать с веб-сокетами.

var net = require("net");

// Node.js 

var Policy = net.createServer(function(socket)
{
    socket.setEncoding('utf8');
    socket.on('connect',function(){
        console.log("Policy Request");
        socket.end("<?xml version=\"1.0\"?><!DOCTYPE cross-domain-policy SYSTEM \"/xml/dtds/cross-domain-policy.dtd\"><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"*\" secure=\"false\"/></cross-domain-policy>");
    });
});

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