PHP websocket |高频发送数据时出现奇怪字符

PHP websocket |高频发送数据时出现奇怪字符,php,websocket,character,Php,Websocket,Character,我有一个javascript websocket客户端和一个php websocket服务器。当我通过循环向服务器发送大量数据时,服务器窗口中会出现奇怪的字符 我发送: setInterval(function() { for (var i=1; i<=5; i++) { WS.send("0"); } }, 1000); setInterval(function() { WS.send("0"); }, 1000); 当我以较低的频率发送数据时

我有一个javascript websocket客户端和一个php websocket服务器。当我通过循环向服务器发送大量数据时,服务器窗口中会出现奇怪的字符

我发送:

setInterval(function() {
    for (var i=1; i<=5; i++) {
        WS.send("0");
    }
}, 1000);
setInterval(function() {
    WS.send("0");
}, 1000);
当我以较低的频率发送数据时,一切正常

我发送:

setInterval(function() {
    for (var i=1; i<=5; i++) {
        WS.send("0");
    }
}, 1000);
setInterval(function() {
    WS.send("0");
}, 1000);
在服务器窗口中:

Received [1]: 0╩┤&ψ╙]▬)╩Zόrcj
Received [1]: 0
Received [1]: 0≤↓ [☺ψ╧
Received [1]: 0¶╞0UoL
§╧q←%ved [1]: 0Τ
Received [1]: 0b:Ρ"6Τι
Received [1]: 0
Received [1]: 0
Received [1]: 0&Ρ┼→↑αΫ
Received [1]: 0
Received [1]: 0
Received [1]: 0
Received [1]: 0╦►╬┘Τ7■
Received [1]: 0SΖ╥m╬'έ
Received [1]: 0
Received [1]: 0,!☼┘L╡?
Received [1]: 0L│%☼ΪH§
Received [1]: 0
Received [1]: 0▀μpp┤A@
Received [1]: 0V[A√╚ύq
Received [1]: 0
Received [1]: 0
Received [1]: 0
Received [1]: 0
Received [1]: 0
Received [1]: 0
Received [1]: 0
Received [1]: 0
Received [1]: 0
为什么会发生这种情况?这正常吗?

用于取消屏蔽数据的函数:

function unmask($data) {
    $length = ord($data[1]) & 127;
    if($length == 126) {$masks = substr($data, 4, 4); $data = substr($data, 8);}
    elseif($length == 127) {$masks = substr($data, 10, 4); $data = substr($data, 14);}
    else {$masks = substr($data, 2, 4); $data = substr($data, 6);}
    $text = "";
    for ($i = 0; $i < strlen($data); ++$i) {$text .= $data[$i] ^ $masks[$i%4];}
    return $text;
}

由于以下原因,您的数据包中有多个WebSocket帧。您发送小消息的速度如此之快,以至于为了最大限度地减少网络拥塞,客户端会一直保留数据,直到得到服务器的确认,或者直到出现合理的超时

要解决这个问题,只需减去
$length
字节数,然后对剩余数据运行
unmask()
函数

您的代码也容易受到在不同数据包之间拆分的超大WebSocket帧的影响;尝试在邮件中发送超过64KB的数据,看看会发生什么。(您可以降低级别,并看到类似的结果;以太网的MTU为1500字节,但TCP本身的MTU为65536字节,因此当发送超过64K时,您将始终看到碎片的影响。)


在我的服务器中,我为每个连接的用户都有一个缓冲区,在我有一个完整的WebSocket框架来处理碎片之前,缓冲区会被填满,我一次只能从缓冲区的前端提取
$header\u length+$message\u length
值的数据,如果缓冲区中有多个帧。

我的websocket服务器是用php语言编写的,我的意思是,你能给我们看一些代码吗?可能是任何原因造成的。Nagle的算法:。您在一个TCP数据包中获得了多个WS-Frame。谢谢您,我的朋友。因为我没有那么先进,你能写“去掩码”功能吗?这对我来说更容易研究,因为我无法100%理解这些东西。例如,我如何获得$length值来去掉这些字节“如果你为一个人生火,你会让他温暖一晚。如果你放火,你会让他温暖一辈子。”--不。WebSocket很容易实现,但它不是一个简单的方法“初学者PHP开发人员的主题。如果你需要的东西只适合你的工作,你会得到报酬,去找一个开源服务器。如果你是为了学习而学习,那么记住失败是学习的重要组成部分,最终的成功会变得更有价值。话虽如此,信息的长度就包含在框架中。您的“取消掩码”功能已经在提取该值。@marirena,而且,讨论如何创建WebSocket服务器的具体细节超出了任何一个问题和本网站的范围。如果/当你再次陷入困境时,请随时提出更多问题,或进入聊天室。(注意这一点,因为我终于把我想说的都说出来了。)