WebSocket Server PHP Chrome 意外的压缩帧


WebSocket Server PHP Chrome unexpected compressed frame

完成一次成功的握手后,我尝试根据最新的协议向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节。 客户端必须屏蔽其消息;服务器不得屏蔽它发送的消息。 您可以尝试从服务器中删除屏蔽吗?