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