如何在本机JavaScript和node.js中使用长轮询?
我需要为聊天应用程序实现如何在本机JavaScript和node.js中使用长轮询?,javascript,node.js,long-polling,Javascript,Node.js,Long Polling,我需要为聊天应用程序实现长轮询。我到处搜索过,但我只找到了如何使用JQuery在JavaScript中实现它。如何仅使用本机JavaScript和node.js实现它?你能给我介绍一些相关的文章或资料吗?Q:如何在nodeJS中使用本机Javascript进行长时间轮询 A:我想首先您需要了解长轮询模型是如何工作的。如果你还没有任何线索,那么这是一个很好的起点 它是关于客户端向服务器发送请求,并等待响应返回 从规范中我们知道,首先客户端必须发出一个http请求,该请求具有无限或至少一个高超时值。
长轮询
。我到处搜索过,但我只找到了如何使用JQuery在JavaScript
中实现它。如何仅使用本机JavaScript
和node.js
实现它?你能给我介绍一些相关的文章或资料吗?Q:如何在nodeJS
中使用本机Javascript
进行长时间轮询
A:我想首先您需要了解长轮询模型是如何工作的。如果你还没有任何线索,那么这是一个很好的起点
它是关于客户端向服务器发送请求
,并等待响应返回
从规范中我们知道,首先客户端必须发出一个http
请求,该请求具有无限或至少一个高超时值。然后,服务器(即您的nodeJs
应用程序)将把所有传入的请求隐藏到一个数据结构中,基本上是一个等待区域。您的应用程序基本上会保留所有响应
对象,直到触发事件,然后您会相应地回复响应
考虑以下伪代码:
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
您可以执行HTTP
调用http://localhost:9999/
使用方法GET
。您应该注意到,在前两次呼叫中,您不会得到响应,只有在您触发第三次呼叫时,您才会收到以前和当前所有呼叫的响应
这里的想法是首先隐藏请求的响应
对象,当一个事件通过时,假设每第三次HTTP调用一次,然后循环通过所有响应并回复它们。就您的聊天应用程序而言,触发响应的事件可能是有人向聊天室发送消息。我建议您查看一下套接字,而不是长轮询,它比长轮询更有效(ps:我最近才知道什么是长轮询,所以我无法帮您回答问题)您好,我不允许使用插座,这是我项目中的一项要求,虽然插座更专业,我在以前的项目中也使用过。嗨,谢谢你的回答,但我有一个问题,当一些用户向房间发送消息时,我可以用计数器值来检查是否有新消息的条件来替换上一个条件吗?也就是说,如果计数器值大于我已有的值,那么聊天室中应该显示新消息,对吗?还有一件事,我如何使用本机javascript在客户端“调用”服务器?我想您需要有两个端点。一个供客户停车等待响应。这在上文中得到了证明。然后是另一个客户端发布聊天信息的窗口。编写消息时,您需要检查该房间的所有响应
对象,并适当地答复它们。关于客户端如何发送消息的其他问题,请拨打HTTP
rest呼叫。例如,请参阅您的代码示例不显示长轮询,它实际上显示的内容既不是长轮询也不是短轮询。对于长轮询,如果在发出请求时数据不可用,将保持连接,当数据可用时,将发送响应。如果数据在超时之前不可用,则应通过超时中止连接。