WebSocket握手不工作

问题描述:

我正在PHP中制作一个简单的WebSocket服务器。我的websocket客户端连接到它很好,但任何时候我尝试通过它发送数据,我得到一个“错误:INVALID_STATE_ERR:DOM异常11”引发的JavaScript。WebSocket握手不工作

This和其他一些问题似乎描述了我遇到的同样的问题,但WebSocket协议已经改变。

我假设问题是,我的脚本握手不正确,如该问题所述。我使用的是Chromium 15,它使用的WebSocket版本8

这是我握手功能(部分我的代码从一个过时的例子,我发现某处部分修改):

function dohandshake($user, $buffer) 
{ 
server_log(1, 'Requesting handshake...'); 

// Determine which version of the WebSocket protocol the client is using 
if(preg_match("/Sec-WebSocket-Version: (.*)\r\n/ ", $buffer, $match)) 
    $version = $match[1]; 
else 
    return false; 

if($version == 8) 
{ 
    // Extract header variables 
    if(preg_match("/GET (.*) HTTP/" ,$buffer,$match)){ $r=$match[1]; } 
    if(preg_match("/Host: (.*)\r\n/" ,$buffer,$match)){ $h=$match[1]; } 
    if(preg_match("/Sec-WebSocket-Origin: (.*)\r\n/",$buffer,$match)){ $o=$match[1]; } 
    if(preg_match("/Sec-WebSocket-Key: (.*)\r\n/",$buffer,$match)){ $k = $match[1]; } 

    // Generate our Socket-Accept key based on the IETF specifications 
    $accept_key = $k . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'; 
    $accept_key = sha1($accept_key, true); 
    $accept_key = base64_encode($accept_key); 

    $upgrade = "HTTP/1.1 101 Switching Protocols\r\n" . 
        "Upgrade: websocket\r\n" . 
        "Connection: Upgrade\r\n" . 
        "Sec-WebSocket-Accept: $accept_key"; 

    socket_write($user->socket, $upgrade, strlen($upgrade)); 
    $user->handshake = true; 
    return true; 
} 
else 
{ 
    server_log("Client is trying to use an unsupported WebSocket protocol ({$version})"); 
    return false; 
} 
} 

我测试的密钥生成代码的几个我发现的例子,它似乎已经根据这些示例返回了正确的密钥

+0

敢问我为什么地球上你正在写一个(希望)高度可用的PHP服务器?? :) –

+0

因为我可以:)(好吧,我发布这个问题的事实可能意味着我只能说这不是重点) – DWilliams

本世纪的愚蠢解决方案,显然在握手响应结束时会有两个“\ r \ n”换行符。

+3

仅供参考:TCP协议通常使用'\ r \ n'(回车+换行)来表示新行。 HTTP使用'\ r \ n \ r \ n'来指示握手的结束。 WebSocket握手被设计为与HTTP兼容。 – kanaka