2012-02-20 9 views
9

Editar: yo probamos este phpwebsocket: http://www.wilky.it/Shared/phpwebsocket.zip y funciona en Firefox, pero mi pregunta sigue siendo: ¿cómo consigo websockets para trabajar con un servidor php en Chrome 17?'Sec-WebSocket-Accept' cabecera no se encuentra en Chrome 17


estoy siguiendo el tutorial aquí: http://net.tutsplus.com/tutorials/javascript-ajax/start-using-html5-websockets-today/

Parece como si el cliente se conecta y desconecta inmediatamente. Me di cuenta de este error en la consola:

Error during WebSocket handshake: 'Sec-WebSocket-Accept' header is missing

Estoy intentando que en Chrome 17.0.963.56 en mi localhost WAMP con la extensión php_sockets habilitado.

Vi en alguna parte que Chrome había cambiado lo que soportaba, pero no profundizó en cómo solucionarlo. Esperaba que alguien pudiera ayudarme a superarlo. (Soy nuevo en websockets).

Servidor:

{PATH}>php startDaemon.php

2012-02-20 07:02:51 System: Socket Resource id #7 created.

2012-02-20 07:02:51 System: Socket bound to localhost:8000.

2012-02-20 07:02:51 System: Start listening on Socket.

2012-02-20 07:03:01 WebSocket: Resource id #8 CONNECTED!

2012-02-20 07:03:01 WebSocket: Requesting handshake…

2012-02-20 07:03:01 WebSocket: Handshaking…

2012-02-20 07:03:01 WebSocket: Done handshaking…

2012-02-20 07:03:01 WebSocket: Resource id #8 disconnected!

Cliente:

Socket Status: 0

Socket Status: 3 (Closed)

+0

Sería útil si pudiera imprimir el saludo recibido y la respuesta completa que se envía. El error indica que falta el valor Aceptar, pero es difícil saberlo sin ver la solicitud y la respuesta de saludo. Observo que el servidor que vinculó está enviando de vuelta a muchos campos en la respuesta. – kanaka

+0

Estoy usando exactamente el código de ese enlace. No estoy seguro exactamente de lo que estás pidiendo? – allicarn

+0

Le pido que agregue instrumentación al código para imprimir la solicitud de saludo (desde el navegador) y la respuesta (desde el servidor). – kanaka

Respuesta

1

que tienen el mismo problema (y que no parecen ser capaces de poner un comentario aquí, así que enviar una respuesta).

En realidad, acabo de descargar y probar phpwebsocket.

En safari 5.1.4, funciona bien.

En Chrome 17, tengo el mismo error en la consola de registro de la escritura:

Error during WebSocket handshake: 'Sec-WebSocket-Accept' header is missing 

Así, en websocket.class.php, he añadido a la cabecera devuelta por el servidor:

$accept = base64_encode(SHA1($key."258EAFA5-E914-47DA-95CA-C5AB0DC85B11")); 

y me sale el error:

Error during WebSocket handshake: Sec-WebSocket-Accept mismatch 

Ahora, la cabecera recibida por el servidor es:

GET /websocket/server.php HTTP/1.1 
Upgrade: websocket 
Connection: Upgrade 
Host: localhost:12345 
Origin: http://localhost:8888 
Sec-WebSocket-Key: OqMJI0t/cOl6d6JNE+Op0g== 
Sec-WebSocket-Version: 13 

y la cabecera enviado por el servidor es:

HTTP/1.1 101 WebSocket Protocol Handshake 
Upgrade: WebSocket 
Connection: Upgrade 
Sec-WebSocket-Origin: http://localhost:8888 
Sec-WebSocket-Location: ws://localhost:12345/websocket/server.php 
Sec-WebSocket-Accept: ZjY5ODliNTViYzJlOTNkMjk4OTg3Y2U2NjQ3MTBlZjZiNzliYzk4Yg== 

El Sec-WebSocket-Accept parece buena, pero todavía hay un error de falta de coincidencia. ¿Ves un error en alguna parte? Tal vez el protocolo ha cambiado para calcular Sec-WebSocket-Accept, pero no lo encuentro ... ¡Gracias por tu ayuda!

Editar: aquí parece ser la solución (para mí, al menos): añadir el verdadero parámetro a la función SHA1, como se encuentra en los archivos dados en this issue thread. Por lo tanto, la Sec-WebSocket-Accept se debe encontrar de esta manera:

$accept = base64_encode(SHA1($key."258EAFA5-E914-47DA-95CA-C5AB0DC85B11", true)); 

Y, Sec-WebSocket-Clave1 y sec-WebSocket-Key2 no parece estar presente ya en la solicitud del cliente, en cambio, $ clave debe extraerse del encabezado: "Sec-WebSocket-Key".

Nuevo problema: Parece que incluso si la conexión del zócalo web funciona en el intercambio de información, se desconecta cuando se envía el primer mensaje.

0

Me di cuenta de que en la consola de Chrome 19: Un servidor no debe enmascarar los marcos que envía al cliente. Quizás este es el problema. Se desconecta tan pronto como se envía un mensaje. Funciona bien en Firefox.

He solucionado este problema de websocket y ahora funciona en cromo. Primero utilizado:

Luego utiliza la función de codificación de: https://github.com/lemmingzshadow/php-websocket

que fija la sustituye la función de codificación con el que está en el archivo connection.php en github de lemmingzshadow y comenzó a trabajar. La función se llama: hybi10Encode en el archivo \ server \ lib \ WebSocket \ connection.php.

cambio de este parámetro en la codificación de la función: $ enmascarado = true a $ enmascarado = false

-1

Una manera fácil de solucionar es añadir Sec-WebSocket-Accept información cuando do_handshake, el código de la siguiente manera:

list($resource,$host,$origin,$key) = $this->getheaders($buffer); 

    $accept = base64_encode(SHA1($key."258EAFA5-E914-47DA-95CA-C5AB0DC85B11", true)); 

    $upgrade = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" . 
      "Upgrade: WebSocket\r\n" . 
      "Connection: Upgrade\r\n" . 
      "WebSocket-Origin: {$origin}\r\n" . 
      "WebSocket-Location: ws://{$host}{$resource}\r\n". 
      "Sec-WebSocket-Accept: " . $accept . "\r\n\r\n"; 
    $this->handshakes[$socket_index] = true; 

    socket_write($socket,$upgrade,strlen($upgrade)); 

donde,

$accept = base64_encode(SHA1($key."258EAFA5-E914-47DA-95CA-C5AB0DC85B11", true));

$ clave es Sec-WebSocket-Key ya ha recibido $ búfer, puede print_r ($ aficionado er) echar un vistazo.

Espero que esto pueda resolver su problema ..

+0

Te estás perdiendo una gran parte del código modificado. – Jeffrey

Cuestiones relacionadas