2011-05-03 72 views
0

最近我一直在玩WebSockets,作为我最新的游戏项目。当我将键盘控制器连接到WebSocket客户端时,我注意到消息的轻微延迟,甚至丢失了消息,WebSocket客户端只是将按键/发布发送到服务器。Firefox是否有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> 

需要注意的是,如果我反复冲“发送”按钮,或者直接按不要紧“发送两个”。

+0

什么版本的Firefox?什么服务器?你使用什么客户端库(如果有的话,如果不是发布一些代码)?您是否在Firefox中手动启用websockets支持,或者您使用的是web-socket-js? – kanaka 2011-05-03 18:20:59

+0

我使用启用了WebSockets的Firefox 4.0.1,并且使用SuperWebSocket作为服务器的基础。大多数代码位于服务器端,并通过套接字发送给客户端。这是一个简单的更新循环,每秒调用30次,并在此期间发送密钥更改。我会看看我是否可以在一起简单的测试页面。 – copyboy 2011-05-03 18:31:58

回答

2

我测试了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 servelet)实施一个等效的简单测试服务器。如果使用其中一种方法进行再现,那么您可能在firefox的WebSockets客户端中发现了一个错误,并且您应该向Mozilla提交一个错误。如果它没有在那里重现,那么它可能是SuperWebSocket中的一个错误或者在你使用它的时候。

+0

有些Firefox配置会导致这种情况吗?除了启用WebSockets之外,我没有改变任何东西。我只是好奇,为什么只有这只发生在Firefox而不是Chrome。这不仅仅是服务器中的错误..?那么我现在写我自己的,所以我还没有测试它。 – copyboy 2011-05-05 10:23:27

+0

它可能是一个错误的地方,虽然我怀疑它是在服务器库(或你使用它的方式),因为Firefox的支持将有更多的测试(包括我自己的)。但是,Firefox和Chrome不会有相同的网络时间,碎片特征等,因此可能会触发服务器中的错误,而另一方则不会。如果SuperWebSocket的开发人员主要针对Chrome而不是Firefox进行测试,则这种情况尤其可能。 – kanaka 2011-05-05 14:45:05