2012-10-21 29 views
1

大家好,感謝您閱讀本文。 我在服務器端使用帶WS模塊的NodeJS,在客戶端使用Firefox中的HTML5 WebSocket API。操作系統是Windows 7 64位。每當我從客戶端連接到服務器時,連接即時形成,但是當我發送一些數據時,會有很大的延遲。有時候,這些消息似乎會立即到達服務器,有時甚至幾秒甚至幾分鐘就會到達服務器,而且大部分時間都無法到達服務器。我附上了客戶端和服務器端的代碼。如果有人能幫助我,我會非常感激。帶nodejs的HTML5 websocket中的通信延遲

客戶端代碼

<!doctype html> 
<html> 
    <head> 
     <script> 
      var ws = new WebSocket("ws://localhost:5225"); 
      ws.onopen = function(){ 
       alert("Sending"); 
       ws.send("SOME DATA !"); 
      } 
     </script> 
    </head> 
    <body> 
    </body> 
</html> 

服務器端代碼

var WebSocketServer = require('./ws').Server; 
var wss = new WebSocketServer({port:5225}); 
var ws; 

wss.on('connection',function (wsock){ 
    console.log("Connection Recieved"); 

    ws = wsock; 

    ws.on('message',onnMessage); 

    ws.on('close',onnClose); 
}); 

function onnMessage(data){ 
     console.log("Data Recieved : "+data); 
} 

function onnClose(){ 
     console.log("Connection closed"); 
} 
+1

您是否嘗試過使用127.0.0.1,並且建議您使用Google Chrome進行測試。它的Devtools(ctrl + shift + j)被集成到瀏覽器中,所以更可靠的說firefox +螢火蟲。我還建議將websock客戶端代碼包裝在'window.onload = function(){}';截至目前您的代碼在DOM準備好之前正在執行 – SReject

+0

我還建議從websocket構造函數之前刪除'var'。你發出的問題可能是在onopen事件觸發之前,var會超出範圍(並收集垃圾)。 – SReject

+0

謝謝大家回答。我最初的嫌疑人也是垃圾收集者,但我已經採取了所有預防措施,現在我不認爲這是造成問題的原因。我還沒有解決這個問題,但我不認爲它是由我的客戶端和服務器代碼引起的。這可能是因爲node.js在Windows環境中從命令提示符運行。 –

回答

0

我當時無法測試,但我相信這個問題是你的WebSocket變量(ws)超出範圍內在事件觸發之前,垃圾收集器正在釋放.onopen()事件或變量。爲了解決這個問題,創建套接字作爲全局(或到在全球範圍內的對象):

<script> 
    window.ws = new WebSocket("ws://localhost:5225"); 
    ws.onopen = function(){ 
     alert("Sending"); 
     ws.send("SOME DATA !"); 
    } 
</script> 
0

要訪問ws對象onopen處理程序內使用this參考,就像這樣:

 ws.onopen = function(){ 
      alert("Sending"); 
      this.send("SOME DATA !"); 
     } 
0

ws example

我做了一個例子。 它只處理文本,文本的大小限制爲64k。

基本上,ws不是一個簡單的套接字。您需要遵循ws協議解析服務器端的數據。