2012-09-17 27 views
5

Estoy codificando un servidor WebSocket en Java. Cuando uso WebSocket para conectarme al servidor en Firefox, encontré que se establecieron dos conexiones, y una de ellas nunca envía datos ...
Mi versión de Firefox es 15.0.1
El mismo código que se ejecuta en Chrome está bien, conecta una vez, establece una sola conexión.
¿Alguien tiene el problema así?WebSocket en Firefox establece dos conexiones

No es el código del servidor:

ServerSocket svrSock = new ServerSocket(); 
svrSock.bind(new InetSocketAddress("0.0.0.0", 11111)); 
while(true) { 
    try { 
     // accept connection 
     Socket clientSock = svrSock.accept(); 
     // print the socket which connected to this server 
     System.out.println("accept socket: " + clientSock); 

     // run a thread for client 
     new ClientThread(clientSock).start(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Y está el código JS:

var url = 'ws://localhost:11111/test/'; 
var ws = new WebSocket(url); 
ws.onopen = function(){ 
    console.log('connected!'); 
    ws.send(11111); 
    ws.close(); 
}; 
ws.onclose = function(){ 
    console.log('closed!'); 
}; 

Cuando ejecuto este js código en Firefox, me sale esto en mi consola del servidor:

aceptar socket: zócalo [addr =/127.0.0.1, puerto = 56935, localport = 11111]
aceptar socket: zócalo [a DDR =/127.0.0.1, puerto = 56936, localport = 11111]

+0

Tengo un servidor websocket en C++ y no lo veo recibiendo dos conexiones de Firefox. ¿Qué versión está utilizando? – Wutz

+0

Mi versión de Firefox es 15.0.1 – takamachi

+0

Hago un servidor simple en C, y simplemente imprimo una línea cuando acepto un conector. También hay dos líneas impresas en la consola. – takamachi

Respuesta

4

Este es un problema en Firefox 15 que está/estará fijado en Firefox 16: https://bugzilla.mozilla.org/show_bug.cgi?id=789018

Firefox 15 está haciendo una conexión especulativa lo cual está bien con HTTP/SPDY pero debido a que el protocolo de enlace WebSocket es HTTP 1.0 (en lugar de 1.1) no puede volver a utilizar la conexión especulativa y tiene que hacer una segunda conexión.

No es un problema crítico si su servidor es multithreaded correctamente y puede aceptar conexiones múltiples, pero es molesto.

+0

¡Gracias! Como dices, no es un problema crítico. Solo quiero saber el motivo. En mi código, cierro la conexión que no envía ningún dato. – takamachi