2017-08-24 108 views
0

嗨,這是我第一次與long polling技術聊天應用程序,在網上搜索我只找到如何實現它在JavaSrcipt使用JQuery,我怎麼才能實現它只使用native JavaScriptnode.js?你能指導一些文章或材料嗎?謝謝如何在原生JavaScript和node.js中使用長輪詢?

+0

我建議你看看有關套接字而不是長輪詢,它比長輪詢更有效https://stackoverflow.com/questions/10028770/in-what-situations-would-ajax-long-short-polling -be-preferred-over-html5-websock(ps:我只是最近知道什麼是長輪詢,所以我不能幫你解決你的問題) – Frankusky

+1

嗨,我不允許使用套接字,這是我的項目中的一個要求,儘管套接字是更專業的,我已經用它在我以前的項目 – user8244016

回答

2

問:如何做本地長輪詢JavascriptnodeJS

答:我想首先你需要了解長輪詢模型是如何工作的。如果你沒有任何線索,那麼RFC-6202 specification是一個很好的起點。

如果你懶得閱讀。這是關於客戶發送requestserver,並等待,直到返回響應。

從規範中我們知道,首先客戶端必須發出一個http請求,該請求具有無限或至少很長的超時值。然後服務器,這是你的nodeJs應用程序預計將所有傳入的請求存儲到一個數據結構,基本上是一個持有區。您的應用程序將基本上保持對象的所有response對象,直到事件被觸發,然後您適當地回覆響應。

考慮這個僞代碼:

const express = require('express'); 
const app = express(); 
const bodyParser = require('body-parser'); 

var requestCounter = 0; 

var responses = { 
    /* Keyed by room Id =*/ 
    "room_abc" : [ /* array of responses */] 
}; 

app.get('/', function (req, res) { 
    requestCounter += 1; 

    var room = /* assuming request is for room_abc */ "room_abc"; 

    // Stash the response and reply later when an event comes through 
    responses[room].push(res); 

    // Every 3rd request, assume there is an event for the chat room, room_abc. 
    // Reply to all of the response object for room abc. 
    if (requestCounter % 3 === 0) { 
     responses["room_abc"].forEach((res) => { 
      res.send("room member 123 says: hi there!"); 
      res.end(); 
     }); 
    } 
}); 

app.use(bodyParser.text({ type: 'text/*' })); 
app.use(bodyParser.json()); 

app.listen(9999, function() { 
    console.log('Example app listening on port 9999!') 
}) 

這是一項相當耗費時間寫在這裏工作的例子,但上面的代碼是如何在NodeJS實現長輪詢一個很好的例子。

如果您已安裝postmancurl您可以使用方法GEThttp://localhost:9999/進行調用HTTP。您應該注意到,在前兩個電話中,您不會得到回覆,並且在您解除第三個電話時,您會收到所有以前和當前電話的回覆。

這裏的想法是先存儲請求的response對象,當事件發生時,假設每進行3次HTTP調用,然後循環所有響應並回復它們。對於您的聊天應用程序的情況,觸發響應的事件可能是有人將消息發送到聊天室時發生的。

+0

嗨,並感謝您的回答,但我有一個問題,請當有人發送消息到房間,我可以取代最後一個條件,檢查是否有按計數器值計算新消息,即如果計數器值大於我已有的值,則應在聊天室中顯示新消息,是嗎?請另外一件事,我怎樣才能在客戶端使用native javascript「調用」服務器? – user8244016

+0

我想你需要有兩個端點。一個讓客戶停下來等待迴應。上面已經說明然後另一個爲客戶發佈聊天消息。當一條消息被寫入時,你會想要遍歷該房間的所有'response'對象並且適當地回覆它們。 –

+0

關於您的其他問題,關於客戶端如何發送「HTTP」休息呼叫。例如參考https://developer.mozilla.org/en-US/docs/Web/API/Request例如 –