【发布时间】:2015-09-07 22:10:13
【问题描述】:
我有一个 javascript websocket 客户端和一个 php websocket 服务器。当我循环发送大量数据到服务器时,服务器窗口中出现奇怪的字符。
我发送:
setInterval(function() {
for (var i=1; i<=5; i++) {
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
当我以较低的频率发送数据时,一切都很好
我发送:
setInterval(function() {
WS.send("0");
}, 1000);
在服务器窗口中:
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;
}
我在这里收到消息:
while(socket_recv($client, $buffer, 2048, 0) >= 1) {
$msg = unmask($buffer);
echo "$msg\n";
}
【问题讨论】:
-
我的websocket服务器是用php语言写的
-
我的意思是,你能给我们看一些代码吗?它几乎可能是任何原因造成的。
-
Nagle 算法:en.wikipedia.org/wiki/Nagle%27s_algorithm 。您在单个 TCP 数据包中获得了多个 WS 帧。