我正在用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
。