我浏览了这里的论坛,这是我发现的最接近的问题:
如何在 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 方法。
谢谢!