Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/452.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript WebSocket非空终止字符串_Javascript_String_Websocket_Null Terminated - Fatal编程技术网

JavaScript WebSocket非空终止字符串

JavaScript WebSocket非空终止字符串,javascript,string,websocket,null-terminated,Javascript,String,Websocket,Null Terminated,我有一个很奇怪的问题。我有一个开放的WebSocket,通讯功能非常好。我还有用于窗口的onblur和onfocus事件,它们通过所述连接通知服务器。但是,在这种情况下,我收到的字符串以非null结尾。在其他情况下,通信工作绝对无可挑剔,即使发送的字符串与在相应的模糊/聚焦事件中发送的字符串相同。为什么会这样?如何修复 下面是一些代码: $(document).ready(function(){ initializeEverything(); window.onblur =

我有一个很奇怪的问题。我有一个开放的WebSocket,通讯功能非常好。我还有用于窗口的onblur和onfocus事件,它们通过所述连接通知服务器。但是,在这种情况下,我收到的字符串以非null结尾。在其他情况下,通信工作绝对无可挑剔,即使发送的字符串与在相应的模糊/聚焦事件中发送的字符串相同。为什么会这样?如何修复

下面是一些代码:

$(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;

}
private函数解码($payload){
$length=ord($payload[1])&127;
如果($length==126){
$masks=substr($payload,4,4);
$data=substr($payload,8);
}elseif($length==127){
$masks=substr($payload,10,4);
$data=substr($payload,14);
}否则{
$masks=substr($payload,2,4);
$data=substr($payload,6);
}
$text='';
对于($i=0;$i

编辑:这只发生在Chrome上。我在Firefox上检查过,Firefox使用相同的WebSocket协议,在那里一切都很好。

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

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

通过在同一Javascript上下文中执行两次单独的发送,您可能能够手动复制问题:

function do_test () {
    ws.send("data1");
    ws.send("data2");
}
这会将两个WebSocket帧发送到足够近的位置,服务器可能会从套接字一次读取它们

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

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


这通常可以这样总结:WebSocket是一种基于消息的传输协议,而TCP套接字是一种流式协议。由于WebSocket是在TCP上分层的,这意味着WebSocket服务器(以及客户端)即使底层传输不是基于消息的,也必须进行转换以向应用程序显示整个消息。

这看起来像是服务器错误。服务器是什么?PHP。但是当我在onblur/onfocus事件之外发送消息时,消息总是正确的。现在,我调整了代码,但是,在尝试您建议的测试时,我会修改代码但是,请正确地对所有消息进行编码:非最后一条消息后附加了一些乱码。为什么会这样?我如何删除/检测它们?因为它们没有任何可识别的模式。例如:
m5§Ë
p
。编辑:我注意到这些冗余字符只以五个为一组出现…?@arik so:wit如果不显示新代码,则很难确定问题所在。