我正在使用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 Preview上使用最新版本的Google Chrome(21.0.1180.4 dev-m),我收到以下消息。
您可以从我的github repo下载php服务器和客户端,并从那里玩很长时间。问题出在WebSockets::send函数中。
private function send($client, $payload)
{
$frame = pack('C2a*', 0b10000001, 0b01111111 & strlen($payload), $payload);
socket_write($client, $frame, strlen($frame));
}
我做错了什么?
答案 0 :(得分:0)
该消息表示浏览器正在获取一个连续帧(操作码为0)而不是文本帧(操作码为1)。我认为你的打包功能不像你想要的那样工作。我不是PHP专家,但也许更像是你想要的东西:
$plen = strlen($payload);
$frame = pack('CCa{$plen}', ...
此外,当有效负载超过125个字节时,您的有效负载长度计算将会中断。对于126到65535字节的有效负载,您需要将长度放在标头的第三个和第四个字节中。对于65536及更长的paylod,您需要将有效负载长度放在标头的第3到第10个字节中(标头的长度根据有效负载长度而变化)。
答案 1 :(得分:0)
我的问题是,在使用二进制语法时,我使用的是little-endian样式而不是big-endian样式。当我应该做0b10000001, 0b01111111
时,我正在做0b10000001, 0b11111110
。