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的主要内容,如果未能解决你的问题,请参考以下文章

Websocket hybi-17新数据格式c++

新协议握手 hybi-10 中的数据编码

The WebSocket Protocol

在 hybi-10 WebSockets 服务器中发送数据时出现问题

Safari 5 / iOS,WebSocket 握手有时有效

从 iPad 上的 websocket 连接中获取错误信息