嗨,這是我第一次與long polling
技術聊天應用程序,在網上搜索我只找到如何實現它在JavaSrcipt
使用JQuery
,我怎麼才能實現它只使用native JavaScript
和node.js
?你能指導一些文章或材料嗎?謝謝如何在原生JavaScript和node.js中使用長輪詢?
回答
問:如何做本地長輪詢Javascript
在nodeJS
?
答:我想首先你需要了解長輪詢模型是如何工作的。如果你沒有任何線索,那麼RFC-6202 specification是一個很好的起點。
如果你懶得閱讀。這是關於客戶發送request
到server
,並等待,直到返回響應。
從規範中我們知道,首先客戶端必須發出一個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
實現長輪詢一個很好的例子。
如果您已安裝postman
或curl
您可以使用方法GET
對http://localhost:9999/
進行調用HTTP
。您應該注意到,在前兩個電話中,您不會得到回覆,並且在您解除第三個電話時,您會收到所有以前和當前電話的回覆。
這裏的想法是先存儲請求的response
對象,當事件發生時,假設每進行3次HTTP調用,然後循環所有響應並回復它們。對於您的聊天應用程序的情況,觸發響應的事件可能是有人將消息發送到聊天室時發生的。
嗨,並感謝您的回答,但我有一個問題,請當有人發送消息到房間,我可以取代最後一個條件,檢查是否有按計數器值計算新消息,即如果計數器值大於我已有的值,則應在聊天室中顯示新消息,是嗎?請另外一件事,我怎樣才能在客戶端使用native javascript「調用」服務器? – user8244016
我想你需要有兩個端點。一個讓客戶停下來等待迴應。上面已經說明然後另一個爲客戶發佈聊天消息。當一條消息被寫入時,你會想要遍歷該房間的所有'response'對象並且適當地回覆它們。 –
關於您的其他問題,關於客戶端如何發送「HTTP」休息呼叫。例如參考https://developer.mozilla.org/en-US/docs/Web/API/Request例如 –
- 1. 使用codeignitor和node.js進行長輪詢
- 2. 如何使用長輪詢(最好不使用Comet或node.js)?
- 3. android原生應用中的長輪詢解決方案?
- 4. 使用Node.js和Nginx負載平衡長輪詢請求
- 5. 如何使用Relay實現長輪詢?
- 6. 如何使用socket.io實現長輪詢?
- 7. WebSockets和長輪詢
- 8. 長輪詢選項:Nginx,PHP,Node.js
- 9. Node.js長輪詢邏輯幫助!
- 10. 使用jQuery和PHP的長輪詢
- 11. CometD和Tomcat不使用長輪詢
- 12. 使用NSURLConnection的長輪詢
- 13. 使用異步長輪詢?
- 14. 如何在NodeJS/Javascript中長時間輪詢?
- 15. 如何在您的網站中使用長輪詢或Ajax Push
- 16. 使用Node.js與Apache一起進行長輪詢
- 17. 使用node.js獲取數據庫更新的長輪詢
- 18. 如何使用PHP和Javascript實現服務器推送/長輪詢/慧星
- 19. 使用Node.js和ajax進行長查詢
- 20. 如何使用flex 3和php獲得「長輪詢」?
- 21. 如何使用PHP和AJAX提高長輪詢功能
- 22. 長輪詢與Java和JBoss
- 23. 如何在node.js中使用原型
- 24. AJAX輪詢頻率 - 要長期輪詢還是不輪詢長輪詢?
- 25. 長輪詢
- 26. Java長輪詢
- 27. Angularjs長輪詢
- 28. 用jQuery和PHP實現長輪詢
- 29. 如何在ASP.NET MVC中應用長輪詢技術?
- 30. 如何在MVC3 jQuery應用程序中實現長輪詢
我建議你看看有關套接字而不是長輪詢,它比長輪詢更有效https://stackoverflow.com/questions/10028770/in-what-situations-would-ajax-long-short-polling -be-preferred-over-html5-websock(ps:我只是最近知道什麼是長輪詢,所以我不能幫你解決你的問題) – Frankusky
嗨,我不允許使用套接字,這是我的項目中的一個要求,儘管套接字是更專業的,我已經用它在我以前的項目 – user8244016