Подтвердить что ты не робот

Chrome & Safari вернется к xhr-опросу, а не к websockets с socket.io

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

Это вывод из node sever при подключении:

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 и запустил node 0.4.7.

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

Как сказано на главном веб-сайте socket.io

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

  • WebSocket
  • Разъем Adobe® Flash®
  • Длительный опрос AJAX
  • Многопоточная потоковая передача AJAX
  • Forever Iframe
  • Опрос JSONP

Довольно ясно, что он вернется к 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);