【发布时间】: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