2011-08-14 67 views
4

我已经在这里浏览论坛,这是我发现的最接近问题:WebSocket伺服器

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

不同的是,我无法获得成功的握手。我认为在握手完成后,取景不会进行,这是否正确?

当Chrome随便更新到使用HyBi 10 websocket协议的版本14(http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-10)时,我即将推出一个概念验证。基于握手规范中的信息(http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-10#section-5.2.2),我已经能够成功创建一个Sec-WebSocket-Accept密钥(基于它们的示例成功),但在客户端,socket.onopen函数从不会触发。

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

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

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套接字保持无限连接状态。这意味着onopen永远不会被解雇,所以我的套接字保持不变。任何关于如何调试,或者甚至更好地确认握手方法的想法都会很棒。

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

谢谢!

+1

对不起,找到我的解决方案。这是在服务器端响应的最后添加另一个\ r \ n。一旦我的时间限制用完,我会发布详细的答案。 – 2bsharpdev

回答

5

所以,我解决我的具体问题与握手,这是很noobish。我需要两套“\ 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); 
} 

希望这可以帮助其他人!现在工作的消息框...

+1

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

0

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

XSockets支持高达hybi10的多协议支持交叉浏览器功能,并回退到silverlight和flash。 还支持协议,处理程序和拦截插件,如果你想编写自己的协议等等......看到http://youtu.be/MDz1jJJeXKI?hd=1

文档演示在http://xsockets.net/Documentation/Index

问候 Uffe

+0

虽然我很欣赏这种回应,但是我无法使用C#,很难将其转换为PHP,并且无论如何,XSockets的服务器端都不是开源的。 – 2bsharpdev

+0

你是对的,目前它只是免费软件。但是,您可以添加与插件的serversidecode。但是,如果你需要完整的开源,这是可能的。目前你错了。 – Uffe

0

另一件事.. 。你可以在JsBin上测试hybi10的支持。所有可编辑的代码都有一个多房间聊天。

尽管没有闪光灯和silverlight回落!

http://jsbin.com/ohitil

/Uffe