WebSockets RFC 6455 规范 - 发送数据错误


WebSockets RFC 6455 Spec - Send Data Error

我正在用PHP编程一个Web套接字服务器,因为我找不到支持RFC 6455规范的服务器。在这样做的过程中,我使用了phpwebsocket代码作为基础,并使其与RFC 6455兼容。至少我在接收消息部分做到了。每当我尝试将消息发送回服务器时,我会收到不同的消息。我敢肯定,这是由于我在位掩蔽方面的技能是......可怕。所以经过相当多的试验和错误,我仍然有这个问题,我不知道为什么。

  Time                     OpCode Mask Length Data
1>2012-06-25T18:05:58.014Z 1      true 4      Ping
2>2012-06-25T18:06:02.121Z 1      true 5      hello
3 2012-06-25T18:06:02.121Z A server must not mask any frames that it sends to the server.

3 2012-06-25T18:06:02.121Z Unexpected continuation frame.

我在计算机上使用PHP 5.4.4,使用命令行界面。 php ws.php 是我启动 Web 套接字服务器所需要做的就是。然后,我使用该wsClient.html作为我的客户端。在Windows 8预览版上使用最新版本的Google Chrome(21.0.1180.4 dev-m),我收到以下消息。

你可以从我的github存储库下载php服务器和客户端,并从那里玩很长时间。问题出在 WebSockets::send 函数中。

private function send($client, $payload)
{
    $frame = pack('C2a*', 0b10000001, 0b01111111 & strlen($payload), $payload);
    socket_write($client, $frame, strlen($frame));
}

我做错了什么?

该消息表示浏览器正在获取一个延续帧(0 表示操作码)而不是文本帧(1 表示操作码)。我不认为您的包功能像您预期的那样工作。我不是PHP专家,但也许更像是这样的意思:

$plen = strlen($payload);
$frame = pack('CCa{$plen}', ...

此外,当有效负载长度超过 125 字节时,有效负载长度计算将中断。对于 126 到 65535 字节的有效负载,您需要将长度放在标头的第三个和第四个字节中。对于 65536 及更长的 paylod,您需要将有效负载长度放在标头的第 3 个到第 10 个字节中(标头的长度因有效负载长度而异)。

我的问题是在使用二进制语法时,我使用的是小端风格而不是大端风格。当我应该做0b10000001, 0b11111110的时候,我正在做0b10000001, 0b01111111