如何在本机JavaScript和node.js中使用长轮询?

use*_*016 7 javascript long-polling node.js

我需要long polling为聊天应用程序实现.我一直在寻找,但我只是在JavaScript使用中找到了如何实现它JQuery.我怎样才能使用native JavaScript和实现它node.js?你能指导我一些相关的文章或材料吗?

Sam*_*Toh 13

问:如何做长轮询在本机JavascriptnodeJS

答:我想首先你需要了解长轮询模型的工作原理.如果您还没有任何线索,那么RFC-6202规范是一个很好的起点.

万一你懒得读.它是关于客户端发送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!')
})
Run Code Online (Sandbox Code Playgroud)

在这里编写一个工作示例相对耗时,但上面的代码是如何实现长轮询的一个很好的例子NodeJS.

如果您已postman安装或curl可以HTTP调用http://localhost:9999/使用方法GET.您应该注意到,在前两个呼叫中,您将无法得到响应,而当您解雇第三个呼叫时,您将收到所有先前和当前呼叫的响应.

这里的想法是你首先存储请求的response对象,当事件发生时,假设在每个第3次HTTP调用时,你循环遍历所有响应并回复它们.对于您的聊天应用程序的情况,触发响应的事件可能是当某人触发到聊天室的消息时.

  • 您的代码示例没有显示长轮询,它实际上显示了既不是长轮询也不是短轮询的内容。对于长轮询,如果在发出请求时数据不可用,连接将被保持,当数据可用时,将发送响应。如果数据在超时前不可用,则连接应中止并超时。 (5认同)