【问题标题】:Implementing handshake for hybi-17为 hybi-17 实现握手
【发布时间】:2011-12-16 00:52:48
【问题描述】:

我正在尝试为 websocket hybi-17 协议 (https://datatracker.ietf.org/doc/html/draft-ietf-hybi-thewebsocketprotocol-17) 开发握手。 根据该草案,我为客户端(用户代理)制作了以下代码:

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

还有这个服务器代码(我跳过了套接字初始化/管理部分):

$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));

现在,举个例子,从客户端请求开始(简单地通过'new MozWebSocket(host)'调用完成):

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

服务器响应(在本地 shell 中回显,作为调试行):

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

我遵循了 IETF hybi-17 草案中的规定,但客户端请求仍在等待中,并且客户端和服务器之间没有真正的连接。

怎么了? 我还需要做什么?

提前致谢。

【问题讨论】:

    标签: php html websocket


    【解决方案1】:

    HTTP 响应是defined

       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
    

    消息正文为空,但在所有标头之后仍应有两个 CRLF(每个标头后有一个 CRLF,最后一个是额外的)。

    所以你的代码应该是这样的:

    $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";
    

    【讨论】:

      猜你喜欢
      • 2011-12-30
      • 1970-01-01
      • 2011-12-18
      • 2014-04-06
      • 2014-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-06
      相关资源
      最近更新 更多