我最近一直在玩WebSockets,作为我的最新游戏项目。当我将键盘控制器连接到WebSocket客户端时,我注意到消息的轻微延迟,甚至消息丢失,它只是将按键/释放发送到服务器。
因此,如果我快速连续发送多条消息,Firefox似乎会在每条消息之间暂停一段时间,如果消息太多,甚至会删除它们。
相同的代码在Chrome中运行良好,没有延迟或消息丢失。这是故意的吗?
编辑:这是一个简化的页面,我遇到了这个问题:
<!DOCTYPE html>
<html lang="en">
<head>
<title>WebSocket Test</title>
<meta charset="utf-8"/>
<script>
socket = new WebSocket("ws://example.com/websockettest");
socket.onopen = function() { message("[[ Connected ]]"); }
socket.onclose = function() { message("[[ Disconnected ]]"); }
socket.onmessage = function(e) { message(e.data); }
function message(msg) {
document.getElementById("messages").textContent += msg + "n";
}
</script>
</head>
<body>
<input type="button" value="Send" onclick="socket.send('Hey!');"/>
<input type="button" value="Send two" onclick="socket.send('Hey once!');
socket.send('Hey twice.');"/>
<pre id="messages"></pre>
</body>
</html>
请注意,如果我重复按"发送"按钮或只按"发送两次",都没有关系。
我已经测试了firefox-4.0.1与noVNC与WebSockets手动启用,它的工作没有任何消息丢失或延迟(在任何方向)。noVNC在两个方向上都发送了大量的流量,任何消息丢失都会导致协议失败,这是我在任何版本的firefox 4 (alpha, beta, 4.0, 4.0.1)中从未见过的,任何延迟都是非常明显的,因为noVNC是高度交互的。
你的客户端代码看起来很好,所以我怀疑是firefox在网络上的行为不同,触发了SuperWebSocket或你的SuperWebSocket代码中的错误。听起来你有一个相当简单的服务器,你可以用它来重现这个。我建议使用不同的框架(如Socket)实现一个等效的简单测试服务器。IO(如果您可以访问Linux系统)或Jetty WebSockets servlet。如果它与其中一个复制,那么您可能发现firefox的WebSockets客户端存在错误,您应该向Mozilla提交错误。如果它没有在那里复制,那么它可能是SuperWebSocket或你使用它的错误。