2011-10-26 3 views
0

Je suis en train de développer la poignée de main pour websocket protocole hybi-17 (http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17). Selon ce projet, je fis le code suivant pour le client (agent utilisateur):poignée de main pour la mise en œuvre hybi-17

var host = 'ws://localhost/server.php'; 
if ('MozWebSocket' in window) ws = new MozWebSocket (host); 
else ws = new WebSocket (host); 

et ce code pour le serveur (je sautais la partie initialisation/de gestion des sockets):

$key = $value = null; 
preg_match ("#Sec-WebSocket-Key: (.*?)\r\n#", $buffer, $match) && $key = $match[1]; 
$key .= "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; 
$key = sha1 ($key); 
$key = pack ('H*', $key); 
$key = base64_encode ($key); 

$value = 
    "HTTP/1.1 101 Switching Protocols\r\n" . 
    "Upgrade: websocket\r\n" . 
    "Connection: Upgrade\r\n" . 
    "Sec-WebSocket-Accept: {$key}"; 

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

maintenant, après un exemple, en commençant par la demande du client (tout simplement fait avec 'nouveau MozWebSocket (host)' appel):

GET /server.php HTTP/1.1 
Host: localhost 
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: it-it,it;q=0.8,en-us;q=0.5,en;q=0.3 
Accept-Encoding: gzip, deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Connection: keep-alive, Upgrade 
Sec-WebSocket-Version: 8 
Sec-WebSocket-Origin: http://localhost 
Sec-WebSocket-Extensions: deflate-stream 
Sec-WebSocket-Key: oqFCBULD7k+BM41Bc3VEeA== 
Pragma: no-cache 
Cache-Control: no-cache 
Upgrade: websocket 

la réponse du serveur (écho dans le shell local, comme ligne de débogage):

HTTP/1.1 101 Switching Protocols 
Upgrade: websocket 
Connection: Upgrade 
Sec-WebSocket-Accept: TlKc0Ck7WpqsLhMm/QXABMQWARk= 

je suivais ce que spécifié dans le hybi-17 IETF projet, mais la demande du client est toujours en attente et il n'y a pas de lien réel entre le client et le serveur.

Qu'est-ce qui ne va pas? Qu'est-ce que je dois faire de plus?

Merci d'avance.

Répondre

0

Une réponse HTTP est defined comme:

Response  = Status-Line    ; Section 6.1 
        *((general-header  ; Section 4.5 
        | response-header  ; Section 6.2 
        | entity-header) CRLF) ; Section 7.1 
        CRLF 
        [ message-body ]   ; Section 7.2 

Le corps du message est vide, mais il doit encore deux CRLFs après tous les en-têtes (un CRLF après chaque en-tête et un un supplémentaire final).

Donc, votre code devrait ressembler à:

$value = 
    "HTTP/1.1 101 Switching Protocols\r\n" . 
    "Upgrade: websocket\r\n" . 
    "Connection: Upgrade\r\n" . 
    "Sec-WebSocket-Accept: {$key}\r\n\r\n";