完成一次成功的握手后,我尝试根据最新的协议向Chrome发送消息。我以未屏蔽、未编码、纯文本形式发送它,并且没有被chr(0)
或chr(255)
包围。第一条消息发送得很好,谷歌浏览器不会关闭连接(虽然它没有触发onmessage
事件,但是当我发送第二条消息时,发生了Received unexpected compressed frame
错误并且连接终止。为什么会这样,我该如何解决?
编辑:我的猜测是我需要在某种操作码之前,例如文本操作码%x1
(无论它的含义如何,无论它在PHP中表示)并附加另一个操作码,用于消息结束。
编辑:最奇怪的事情发生了:我再次尝试了另一个问题中的代码,但停用了base64编码:
private static function encode($text) {
// $text = base64_encode($text);
// 0x1 text frame (FIN + opcode)
$b1 = 0x80 | (0x1 & 0x0f);
$length = strlen($text);
if ($length <= 125)
$header = pack('CC', $b1, $length);
elseif ($length > 125 && $length < 65536)
$header = pack('CCn', $b1, 126, $length);
else
$header = pack('CCN', $b1, 127, $length);
return $header . $text;
}
现在它起作用了?!尽管编码应该无关紧要,因为它无论如何都在描述之后。不过,我不会抱怨。
手后的消息不会以纯文本形式发送。 有关详细信息,请参阅规范的数据框架部分。 或者查看最近的问题,了解如何编写 php 服务器。 (请注意,该问题中的代码是因为它不太有效而发布的。 您需要应用答案中建议的更改。
编辑:请参阅规范的第5.1节。 客户端必须屏蔽其消息;服务器不得屏蔽它发送的消息。 您可以尝试从服务器中删除屏蔽吗?