PHP Websocket 服务器 hybi10
Posted
技术标签:
【中文标题】PHP Websocket 服务器 hybi10【英文标题】:PHP Websocket Server hybi10 【发布时间】:2011-08-17 03:04:12 【问题描述】:所以 Chrome 14 已经实现了 hybi10 版本的 websockets。我有一个内部程序,我们公司通过 chrome 使用该程序,该程序使用 websockets,此更改已损坏。
有没有人成功地使用 php 服务器构建数据?我能够让新的握手工作,但我似乎无法弄清楚框架。 https://github.com/kanaka/websockify/blob/master/websocket.py#L233 这里有一个 python 示例,但我很难将其转换为 php,有人有建议吗?
我应该提到,python 示例中的函数是 decode_hybi()。
【问题讨论】:
也许这个问题对你来说很有趣:***.com/questions/7040078/…。我试图解释新框架是如何工作的;也许有帮助。 这很有帮助,谢谢!我将在 PHP 中为其他人发布解决方案。 【参考方案1】:我刚刚完成了一个课程,使 Nico Kaiser (https://github.com/nicokaiser/php-websocket) 的 PHP-Websocket-Server 能够处理 hybi-10 帧和握手。您可以在这里下载新课程:http://lemmingzshadow.net/386/php-websocket-serverclient-nach-draft-hybi-10/ (Connection.php)
【讨论】:
谢谢。我最初也使用这个实现。您确实改进了我的代码并节省了我实施完整解决方案的时间!【参考方案2】:此代码假定没有错误或格式错误的帧,并且基于此答案 - How to (de)construct data frames in WebSockets hybi 08+?。
这段代码非常基础,远非完整的解决方案。它适用于我的目的(这是非常基本的)。希望对其他人有用。
function handle_data($data)
$bytes = $data;
$data_length = "";
$mask = "";
$coded_data = "" ;
$decoded_data = "";
$data_length = $bytes[1] & 127;
if($data_length === 126)
$mask = substr($bytes, 4, 8);
$coded_data = substr($bytes, 8);
else if($data_length === 127)
$mask = substr($bytes, 10, 14);
$coded_data = substr($bytes, 14);
else
$mask = substr($bytes, 2, 6);
$coded_data = substr($bytes, 6);
for($i=0;$i<strlen($coded_data);$i++)
$decoded_data .= $coded_data[$i] ^ $mask[$i%4];
$this->log("Server Received->".$decoded_data);
return true;
这是发回数据的代码。同样,这是非常基本的,它假设您正在发送单个文本框架。没有延续帧等。也没有错误检查。希望其他人觉得它有用。
public function send($data)
$frame = Array();
$encoded = "";
$frame[0] = 0x81;
$data_length = strlen($data);
if($data_length <= 125)
$frame[1] = $data_length;
else
$frame[1] = 126;
$frame[2] = $data_length >> 8;
$frame[3] = $data_length & 0xFF;
for($i=0;$i<sizeof($frame);$i++)
$encoded .= chr($frame[$i]);
$encoded .= $data;
write_to_socket($this->socket, $encoded);
return true;
【讨论】:
太好了,你成功了。您可以选择是否要将数据从服务器编码到客户端。不过,您应该再次以1000 0001
开头,然后是另一个以0
开头的字节(如果您不屏蔽它),并使用相同的长度格式(这是强制性的;屏蔽不符合规范)。
再次感谢您的帮助!我也设法让这部分工作。我将在下面再次复制我的代码,以便其他人可以使用它。
感谢您发布您的解决方案;这肯定对其他人有帮助!以上是关于PHP Websocket 服务器 hybi10的主要内容,如果未能解决你的问题,请参考以下文章
在 hybi-10 WebSockets 服务器中发送数据时出现问题