【问题标题】:WebSocket Server using latest protocol (hybi 10)使用最新协议的 WebSocket 服务器 (hybi 10)
【发布时间】:2011-10-26 16:45:14
【问题描述】:

我浏览过这里的论坛,这是我发现的最接近的问题:

How to (de)construct data frames in WebSockets hybi 08+?

不同之处在于我无法成功握手。我假设在握手完成之前框架不会起作用,这是正确的吗?

当 Chrome 方便地更新到使用 HyBi 10 websocket 协议 (https://datatracker.ietf.org/doc/html/draft-ietf-hybi-thewebsocketprotocol-10) 的版本 14 时,我正要启动概念验证。根据握手规范中的信息(https://datatracker.ietf.org/doc/html/draft-ietf-hybi-thewebsocketprotocol-10#section-5.2.2),我已经能够成功创建一个 Sec-WebSocket-Accept 密钥(基于他们的示例成功),但在客户端,socket.onopen 函数永远不会触发.

上次我遇到了 WebSocket 协议握手的问题,这是用正确的字节终止握手的问题(或者我认为字符更准确?)。我在当前的实现中使用 PHP,这意味着尝试解码 Python 或 C# 实现,但到目前为止没有成功。

这是我在 Chrome 14(适用于 Windows)中运行的客户端 Javascript:

var socket;
socket = new WebSocket(host);
socket.onopen = function(msg){
    // process onopen
};
socket.onmessage = function(msg){ 
    // process message
};
socket.close = function(msg){
    // process close
};

这是我用于握手的服务器端 PHP 代码:

function dohandshake($user,$buffer){
    // getheaders and calcKey are confirmed working, can provide source if desired
    list($resource,$host,$origin,$key,$version) = $this->getheaders($buffer);
    $request = "HTTP/1.1 101 Switching Protocols\r\n" .
            "Upgrade: WebSocket\r\n" .
            "Connection: Upgrade\r\n" .
            "Sec-WebSocket-Accept: " . $this->calcKey($key) . "\r\n";
    socket_write($user->socket,$request);
    $user->handshake=true;
    return true;
}

一旦客户端发送初始握手,Javascript 套接字就会无限期地保持在 CONNECTING 状态。这意味着 onopen 永远不会被触发,因此我的套接字处于不确定状态。任何关于如何调试甚至更好地确认我的握手方法的想法都会很棒。

这是 Python (https://github.com/kanaka/websockify/blob/master/websocket.py) 中的一个明显(我不能说它是否有效)解决方案。寻找 do_handshake 方法。

谢谢!

【问题讨论】:

  • 很抱歉,找到了我的解决方案。这是在服务器端响应的末尾添加另一个 \r\n 。一旦我的时间限制用完,我会发布详细的答案。

标签: html websocket phpwebsocket


【解决方案1】:

这是我对这个问题的解决方案。如果在遥远的将来某个时候此代码停止工作,请在此处发布!

https://github.com/esromneb/phpwebsocket/blob/master/websocket.class.php

查看我的播客,了解更多黑客技巧! http://portforwardpodcast.com/

【讨论】:

    【解决方案2】:

    所以我用握手解决了我的特殊问题,这很无聊。我需要两组“\r\n”来结束握手。因此,要解决我上面描述的握手问题(Javascript WebSocket 不会进入 OPEN 状态),我需要对我的服务器端 PHP 进行以下更改(注意末尾的 \r\n\r\n,doh) :

    function dohandshake($user,$buffer){
        // getheaders and calcKey are confirmed working, can provide source if desired
        list($resource,$host,$origin,$key,$version) = $this->getheaders($buffer);
        $request = "HTTP/1.1 101 Switching Protocols\r\n" .
            "Upgrade: WebSocket\r\n" .
            "Connection: Upgrade\r\n" .
            "Sec-WebSocket-Accept: " . $this->calcKey($key) . "\r\n\r\n";
        socket_write($user->socket,$request);
        $user->handshake=true;
        return true;
    }
    

    另外对于未来的 PHP-WebSocket 爱好者,我只是使用正则表达式来解析 getheaders 中的标头,这是 calcKey:

    function calcKey($key){
         $CRAZY = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
         $sha = sha1($key.$CRAZY,true);
         return base64_encode($sha);
    }
    

    希望这对其他人有帮助!现在开始处理消息框架...

    【讨论】:

    • 感谢您的解决方案。你能发布你所有的代码吗?或者至少您修改后的 getheaders() 函数?我想把它放在一个 github 项目中!
    【解决方案3】:

    另一件事...您可以在 JsBin 上测试对 hybi10 的支持。那里有一个包含所有可编辑代码的多房间聊天。

    虽然没有闪光灯和银光后备!

    http://jsbin.com/ohitil

    /乌菲

    【讨论】:

      【解决方案4】:

      xsockets.net 在 c# 中提供服务器端解决方案,如果可以的话?但是,您不需要编写任何服务器端代码来执行您在上面尝试执行的操作。使用通用处理程序并且只编写 JavaScript。

      XSockets 具有跨浏览器功能和回退到 silverlight 和 flash 的多协议支持,最高支持 hybi10。 如果您想编写自己的协议等,还支持协议、处理程序和拦截器的插件...参见http://youtu.be/MDz1jJJeXKI?hd=1的演示

      文档http://xsockets.net/Documentation/Index

      最好的问候 乌菲

      【讨论】:

      • 虽然我很欣赏您的回复,但我不能使用 C#,很难将其转换为 PHP,而且 XSockets 的服务器端似乎也不是开源的。跨度>
      • 你是对的,目前它只是免费软件。但是,您可以使用插件添加服务器端代码。但是,如果您需要完全开源,那是很有可能的。你现在错了。
      猜你喜欢
      • 2011-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-15
      • 1970-01-01
      相关资源
      最近更新 更多