我在这里浏览了论坛,这是我发现的最接近的问题:
How to (de)construct data frames in WebSockets hybi 08+?
不同之处在于我无法获得成功的握手。我假设在握手完成之后框架不会发挥作用,这是正确的吗?
当Chrome方便地更新到使用HyBi 10 websocket协议(http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-10)的版本14时,我即将发布概念验证。基于握手规范中的信息(http://tools.ietf.org/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方法。
谢谢!
答案 0 :(得分:5)
答案 1 :(得分:1)
这是我对这个问题的解决方案。如果在遥远的将来这个代码停止工作,请在这里发帖!
https://github.com/esromneb/phpwebsocket/blob/master/websocket.class.php
查看我的播客以获取更多黑客提示! http://portforwardpodcast.com/
答案 2 :(得分:0)
xsockets.net在c#中提供了服务器端解决方案,如果可以的话?但是,您不需要编写任何服务器端代码来执行上面尝试的操作。使用通用处理程序,只编写JavaScript。
XSockets具有多协议支持,最高支持hybi10,具有crossbrowser功能,并且可以回退到silverlight和flash。 如果您想编写自己的协议等,还支持协议,处理程序和拦截器的插件...请参阅http://youtu.be/MDz1jJJeXKI?hd=1上的演示
http://xsockets.net/Documentation/Index
的文档最诚挚的问候 Uffe
答案 3 :(得分:0)