PHP中的简单websocket服务器

PHP中的简单websocket服务器,php,websocket,phpwebsocket,Php,Websocket,Phpwebsocket,我正在用PHP开发一个简单的websocket服务器。我知道有相当多的现有实现,但我想自己实现,以便更好地学习协议。我成功地完成了握手,我的客户端连接到了服务器。我还设法解码了来自客户端的数据,但在发回消息时遇到了问题。客户端在收到我的响应时断开连接。Firefox说,加载页面时,与ws://localhost:12345/的连接被中断。 我曾经当过导游 以下是我包装数据的代码: private function wrap($msg = ""){ $length = strlen($ms

我正在用PHP开发一个简单的websocket服务器。我知道有相当多的现有实现,但我想自己实现,以便更好地学习协议。我成功地完成了握手,我的客户端连接到了服务器。我还设法解码了来自客户端的数据,但在发回消息时遇到了问题。客户端在收到我的响应时断开连接。Firefox说,
加载页面时,与ws://localhost:12345/的连接被中断。

我曾经当过导游

以下是我包装数据的代码:

private function wrap($msg = ""){
    $length = strlen($msg);
    $this->log("wrapping (" . $length . " bytes): " . $msg);

    $bytesFormatted = chr(129);
    if($length <= 125){
        $bytesFormatted .= chr($length);
    } else if($length >= 126 && $length <= 65535) {
        $bytesFormatted .= chr(126);
        $bytesFormatted .= chr(( $length  >> 8 ) & 255);
        $bytesFormatted .= chr(( $length       ) & 255);
    } else {
        $bytesFormatted .= chr(127);
        $bytesFormatted .= chr(( $length >> 56 ) & 255);
        $bytesFormatted .= chr(( $length >> 48 ) & 255);
        $bytesFormatted .= chr(( $length >> 40 ) & 255);
        $bytesFormatted .= chr(( $length >> 32 ) & 255);
        $bytesFormatted .= chr(( $length >> 24 ) & 255);
        $bytesFormatted .= chr(( $length >> 16 ) & 255);
        $bytesFormatted .= chr(( $length >>  8 ) & 255);
        $bytesFormatted .= chr(( $length       ) & 255);
    }

    $bytesFormatted .= $msg;
    $this->log("wrapped (" . strlen($bytesFormatted) . " bytes): " . $bytesFormatted);
    return $bytesFormatted;
}
它打印6个字节,这意味着6个字节实际上写入了导线

如果我尝试使用
aaa
,Chrome不会打印错误,但也不会调用我的onmessage处理程序。它挂起,好像在等待更多数据


非常感谢您的帮助。谢谢。

当我编写websocket类时,我也遇到了同样的问题。 在我的例子中,我使用输出缓冲来确定在发送回复之前我是在回显某些内容。
可能会尝试一下,看看是不是问题。

我也遇到了同样的问题:对于从服务器发送的某些消息,浏览器中没有响应,对于某些消息,显示了错误“服务器不能屏蔽任何帧…”,但我没有添加任何屏蔽。 原因就在那次握手中。 握手是:

"HTTP/1.1 101 Web Socket Protocol Handshake\r\n" .
...
"WebSocket-Location: ws://{$host}{$resource}\r\n\r\n" . chr(0)

这就是chr(0)的原因,在我删除它之后,一切正常。

您是否使用wireshark检查通过线路发送的字节是否与此处代码中生成的字节匹配?没有其他代码发送可能被解释为消息开头的附加数据?@simonc它在同一台机器上,所以我认为wireshark看不到包。我会设法闻一闻。谢谢。你有第二台可以临时运行Firefox的机器吗?为什么要使用chr函数而不是pack函数?@DaveKok
chr(129)
返回一个字节
pack('c',129)
还返回一个字节。看你是个天才。非常感谢。
"HTTP/1.1 101 Web Socket Protocol Handshake\r\n" .
...
"WebSocket-Location: ws://{$host}{$resource}\r\n\r\n" . chr(0)