0

我正在用 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));
}

我究竟做错了什么?

4

2 回答 2

0

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

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

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

于 2012-06-25T19:01:14.127 回答
0

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

于 2012-07-12T09:32:06.060 回答