gpt4 book ai didi

html - 使用最新协议(protocol)的 WebSocket 服务器 (hybi 10)

转载 作者:搜寻专家 更新时间:2023-10-31 08:08:37 24 4
gpt4 key购买 nike

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

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

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

当 Chrome 方便地更新到使用 HyBi 10 websocket 协议(protocol) (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 key (基于他们的示例成功),但在客户端,socket.onopen 函数永远不会触发.

上次我遇到 WebSocket 协议(protocol)握手问题时,问题是用正确的字节终止握手(或者我认为字符更准确?)。我在当前实现中使用 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”来结束握手。所以要解决我上面描述的握手问题(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;
}

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

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

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

关于html - 使用最新协议(protocol)的 WebSocket 服务器 (hybi 10),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7055511/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com