我需要为一个聊天应用程序实现长轮询(long polling)。 我搜索过,但我只找到如何使用JQuery在JavaScript中实现它。 我该如何仅使用原生 JavaScript和node.js来实现它? 你能引导我一些相关的文章或资料吗?
我需要为一个聊天应用程序实现长轮询(long polling)。 我搜索过,但我只找到如何使用JQuery在JavaScript中实现它。 我该如何仅使用原生 JavaScript和node.js来实现它? 你能引导我一些相关的文章或资料吗?
问题: 如何在本地的Javascript
中使用长轮询,在nodeJS
中实现?
回答: 首先,我想你需要了解长轮询模型的工作原理。如果您还没有任何线索,那么RFC-6202规范是一个很好的起点。
它涉及到客户端向服务器发送一个请求,并等待直到响应返回。
从规范中,我们知道客户端首先必须发出一个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
对象存储起来,当事件出现时(假设每隔三个 HTTP 调用),然后循环遍历所有的响应并回复它们。对于聊天应用程序的情况,触发响应的事件可能是某人向聊天室发送消息。
response
对象,并适当地进行回复。 - Samuel Toh