【问题标题】:WebSocket handshake not workingWebSocket 握手不起作用
【发布时间】:2012-08-15 21:51:11
【问题描述】:

我正在用 PHP 制作一个简单的 WebSocket 服务器。我的 websocket 客户端可以很好地连接到它,但是每当我尝试通过它发送数据时,我都会在 JavaScript 中抛出“错误:INVALID_STATE_ERR:DOM 异常 11”。

This 和其他几个问题似乎描述了我遇到的同样问题,但 WebSocket 协议从那以后发生了变化。

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

这是我的握手函数(我的部分代码部分是从我在某处找到的过时示例修改的):

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;
}
}

我在找到的几个示例中测试了密钥生成代码,根据这些示例,它似乎返回了正确的密钥

【问题讨论】:

  • 我敢问你到底为什么要用 PHP 编写一个(希望是)高可用性服务器??... :)
  • 因为我可以:)(好吧,我发布这个问题可能意味着我不能,但这不是重点)

标签: php javascript websocket


【解决方案1】:

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

【讨论】:

  • 仅供参考:TCP 协议通常使用\r\n(回车+换行)来指示新行。 HTTP 使用\r\n\r\n 来指示握手的结束。 WebSocket 握手被设计为与 HTTP 兼容。
猜你喜欢
  • 1970-01-01
  • 2011-09-22
  • 1970-01-01
  • 2018-10-16
  • 1970-01-01
  • 2014-12-10
  • 2012-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多