javascript - Chrome y Safari vuelven al sondeo xhr en lugar de websockets con socket.io
node.js (1)
Tengo un problema con websockets y socket.io. Cuando intento conectarme a mi servidor de nodos con socket.io, inicialmente se conecta mediante websockets, pero cuando vuelve a sondear el jsonp poco después.
Esta es la salida del nodo node cuando me conecto:
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
Esto sucede en Chrome y Safari. He actualizado a la última versión de socket.io 0.6.17 y estoy ejecutando el nodo 0.4.7.
He intentado eliminar mis cookies y mi caché como se sugiere en github y SO, sin embargo, el problema persiste. Además, cuando intento forzar websockets, nunca se conecta completamente con un ID de sesión.
¿Alguien tiene alguna idea?
La API de Websocket no es compatible de forma predeterminada en todos los navegadores en el momento (según mi conocimiento) debería funcionar en cromo, aunque intente probarlo en cromo o firefox (después de editar la configuración predeterminada) y vea si eso todavía vuelve a XHRPolling.
Lo estoy ejecutando en una IP diferente, ya que necesito ejecutar el nodo en el puerto 80, lo que causa conflicto en mi servidor web con Apache. ¿No se pueden usar websockets / flashsockets entre dominios?
Ahora puede haber 2 razones diferentes para el error desde aquí
Web / Flash Sockets no le permitirán conectarse al cliente de node.js a menos que especifique un puerto diferente como el 81 o que especifique especialmente apache para enviar la solicitud entrante al Nodo. una solución fácil podría ser escribir el servidor HTTP basado en Node.js para retransmitir datos desde Apache (y configurar Apache para que se ejecute en un puerto diferente y luego 80)
Este enlace le indica cómo hacerlo ... en este proceso puede hacer que Node.js haga algo como verificar si la solicitud proviene de un websocket / httpbrowser si es un navegador http que reenvía la solicitud a Apache, si no, es decir, si es de web / flash zócalos y luego manejar el zócalo en consecuencia. o como se comentó en la pregunta. Especifique APACHE a proxy para Node.js.
Flashsockets requiere que sirva un archivo de política de dominio cruzado en el puerto 843 ¿está seguro de que está proporcionando un archivo de dominio cruzado? (Creo que socket.io tiene una funcionalidad incorporada para hacer eso, pero aún así siempre es bueno verificarlo).
Como se indica en el sitio web de socket.io
Para proporcionar conectividad en tiempo real en cada navegador, Socket.IO selecciona el transporte más capaz en tiempo de ejecución, sin que esto afecte a la API.
- WebSocket
- Adobe® Flash® Socket
- AJAX larga encuesta
- AJAX multipart streaming
- Iframe para siempre
- Encuesta JSONP
Está bastante claro que volverá a AJAX Long Polling si los websockets están deshabilitados y Adobe Flash Socket no se puede conectar (esto podría deberse a la falta de disponibilidad del archivo de políticas).
Aquí hay un código de ejemplo para el archivo de dominio cruzado que puede incluir en su código y ver si eso hace que su servidor se ejecute con websockets.
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);