2011-05-03 109 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