2015-02-23 66 views
0

我是Nodejs基於事件的異步通信的新手。對於Websocket客戶端 - 服務器通信,我到目前爲止已經發現,在套接字連接建立之後,客戶端和服務器將基於事件觸發器相互通信。Nodejs websocket:如何在沒有服務器響應的情況下連續發送客戶端消息

在客戶端,我創建了一個新的websocket並與Nodejs服務器進行通信。客戶端事件我至今是:插座成立

1. socket.on('open', function open() {} 
2. socket.on('message', function message(data) {} 
3. socket.on('close', function close() {} 
4. socket.on('error', function error(err) {} 

後,socket.on('message'被觸發,每次服務器發送的響應消息。目前我正在發送一個客戶端消息到這個函數裏面的服務器。

但是,服務器端邏輯是這樣的,客戶端將持續不斷地發送消息,服務器將接受,但可能不會發回回復。因此,socket.on('message'可能不會始終被觸發,因此,根據我的邏輯,如果服務器沒有響應,我將無法從客戶端發送更多消息!

我試過的解決方案: socket.on('open'裏面的回調函數我保持一個async.whilst()循環來不斷地發送消息到服務器。在socket.on('open'之外,我保留了上面列出的其他事件。

但是,當我運行的代碼,從客戶端的所有消息都相繼去了一個又一個,但socket.on('message'是沒有得到觸發的。從服務器日誌中,我確認服務器正在正確發送消息。

從這個行爲看來,while循環實際上就像一個阻塞while循環,我不想!我在這裏做錯了什麼?

由於機密問題,我將無法粘貼我的所有源代碼,但我正在使用async.whilst()循環粘貼我的socket.on('open'正文。另外,我正在爲其他活動添加地點持有人。

下面是代碼:

var count=10; 
socket.on('open', function open() { 

    async.whilst(
     function() { return count>=0; }, 
     function (callback) { 
       console.log("Allowed to send msgs? YES");  
       senddataToServer(socket); //This function sends data to server using a callback function to catch error, hence asynchronous. 
       count--; 
       callback(); 
     }, 
     function (err) { 
      console.log("Allowed to send msgs? NO");  
      socket.close(); 
     } 
    ); 
    }); 

socket.on('message', function message(data) {} 
socket.on('close', function close() {} 
socket.on('error', function error(err) {} 

senddataToServer(socket){} 

我從這個鏈接得到的代碼async.whilstwhilst(test, fn, callback)

+0

不發送消息內部事件,根據需要從外部發送,而不是每消息一次。 – dandavis 2015-02-23 23:08:20

+0

我不知道如何從'需要外部'不斷髮送。這就是爲什麼我用async.whilst()嘗試了一個備用解決方案。請檢查'我嘗試過的解決方案'部分。那部分也不起作用。因此,我發佈了這個問題。謝謝! – kajarigd 2015-02-23 23:13:54

+0

它很簡單,在你的代碼中:'socket.send(「hello world」);'在任何地方運行。例如:'setInterval(function(){socket.send(+ new Date);},1000);'我根本看不到任何需要異步庫的信息... – dandavis 2015-02-23 23:16:10

回答

0

您需要決定要觸發客戶端發送新數據到服務器的內容。您不應該使用來自服務器的消息的傳入來觸發與傳入的服務器消息無關的客戶端發送。

您的觸發客戶端發送選項:

  1. 使用setTimeout()setInterval()的東西發送到服務器定期時間間隔(如每30秒)。

  2. 響應客戶端中的某些事件,並將其用作將數據發送到服務器的觸發器(例如按鈕單擊,鼠標移動,數據到達等)。

如果您想更具體的瞭解你想要什麼,發送到服務器,當它是適當的將其發送到服務器,我們可以建議更具體地約到最佳時間表或如何觸發發送。

+0

客戶端將開始發送「Hello 「在websocket連接建立後立即連接到服務器。來自服務器的第一個「Hello」將觸發處理某些內部邏輯的開始,並且在內部處理結束之前不會將任何回覆發送回客戶端。一旦處理結束,服務器將發回一個響應給客戶端。但與此同時,客戶會不斷髮送「你好」,不會停止。 – kajarigd 2015-02-23 23:23:20

+0

@kajarigd - 但爲什麼從客戶端發送無意義的「hello」消息到服務器。客戶端不應該在緊密循環中旋轉,儘可能多地向服務器發送消息。這是可笑的低效率,似乎並沒有實際完成任何事情。如果客戶端使用電池供電的設備(例如平板電腦或智能手機),則會很快耗盡電池電量。而且,它將爲客戶端和服務器的互聯網連接使用無意義的帶寬。如果您描述的是您真正想要解決的問題,我們可以提供幫助,但我們需要真實的信息。 – jfriend00 2015-02-23 23:27:58

+0

其實,我向你解釋了我對'你好'例子的要求。一旦創建了websocket,服務器的工作就是監視客戶端的瀏覽器活動(鼠標移動,點擊,關鍵字類型等)。根據客戶在做什麼樣的活動,服務器會發送一個響應。服務器代碼不在我的控制之下,因此我不確切知道哪些瀏覽器活動是有意義的以及在什麼情況下。因此,我的工作是編寫一個代碼,客戶端將不斷髮送瀏覽器活動到服務器。服務器將在需要時回覆。 – kajarigd 2015-02-23 23:34:57

相關問題