gpt4 book ai didi

JavaScript WebSocket 非空终止字符串

转载 作者:行者123 更新时间:2023-11-30 18:24:40 25 4
gpt4 key购买 nike

我有一个非常奇怪的问题。我有一个开放的 WebSocket,通信完美无缺。我还有窗口的 onblur 和 onfocus 事件,它们通过所述连接通知服务器。但是,在那种情况下,我收到的字符串是非空终止的。通信在其他方面绝对无可挑剔,即使发送与相应模糊/焦点事件相同的字符串也是如此。为什么会这样,如何解决?

这是一些代码:

$(document).ready(function(){

initializeEverything();

window.onblur = function(){ notifyFocusChange(false); };

window.onfocus = function(){ notifyFocusChange(true); };

});

function notifyFocusChange(present){

if(present){
webSocket.send('presence:present');
}else{
webSocket.send('presence:absent');
}

}

下面是事件触发时我收到的非 null 终止字符串的示例:

存在:不存在Ï┘ê÷/à°äJ÷ÝÿLÓ▓ùM÷Ýÿ[

编辑:有人建议这可能是服务器错误,所以这里是解码传入消息的代码:

private function decode($payload) {

$length = ord($payload[1]) & 127;

if ($length == 126) {
$masks = substr($payload, 4, 4);
$data = substr($payload, 8);
} elseif ($length == 127) {
$masks = substr($payload, 10, 4);
$data = substr($payload, 14);
} else {
$masks = substr($payload, 2, 4);
$data = substr($payload, 6);
}

$text = '';
for ($i = 0; $i < strlen($data); ++$i) {
$text .= $data[$i] ^ $masks[$i % 4];
}

return $text;

}

编辑:它只发生在 Chrome 中。我在使用相同 WebSocket 协议(protocol)的 Firefox 上进行了检查,一切正常。

最佳答案

onblur 和 onfocus 事件可能会快速连续发生多次。这意味着 websocket.send 调用也被快速连续多次调用。

如果多个发送调用发生得足够近,那么您很可能会在服务器的一次读取中收到多个帧,我相信这就是您所看到的。换句话说,您的负载中的“垃圾”实际上是一个或多个后续的 WebSocket 帧。

您可以通过在同一 Javascript 上下文中执行两个单独的发送来手动复制该问题:

function do_test () {
ws.send("data1");
ws.send("data2");
}

这将发送两个足够靠近的 WebSocket 帧,服务器可能会同时从套接字中读取它们。

为了正确处理帧,您必须解析有效负载长度字段,并且只读取/取消屏蔽指定数量的有效负载数据。剩余的任何内容都需要作为新帧的开始排队。

此外,不仅可以从套接字的一次读取中返回多个 Websocket 帧,而且您不能依赖将帧作为整个帧读取:您可能会在一次读取中读取一半的帧,而在下一次读取中读取另一半框架。换句话说,第一次从套接字读取时,您可能会得到 3 个完整的 websocket 帧加上第 4 帧的 1 个字节,然后在下一次从套接字读取时,您会得到第 4 帧的其余部分。

这通常可以这样概括:WebSockets 是一种基于消息的传输协议(protocol),而 TCP 套接字是一种流式传输协议(protocol)。由于 WebSockets 在 TCP 上分层,这意味着 WebSocket 服务器(以及与此相关的客户端)必须进行转换以将整个消息呈现给应用程序,即使底层传输不是基于消息的。

关于JavaScript WebSocket 非空终止字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11203794/

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