Потоковая передача данных с Node.js

Я хочу знать, возможно ли передать данные потоком от сервера до клиента с Node.js. Я хочу отправить единственный запрос Ajax на Node.js, затем оставить соединение открытым и непрерывно потоковые данные клиенту. Клиент получит этот поток и обновлять страницу непрерывно.

Обновление:

Как обновление этого ответа - я не могу заставить это работать. response.write не отправляется перед вызовом close. Я настроил пример программы, который я использую для достижения этого:

Node.js:

var sys = require('sys'), 
http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    var currentTime = new Date();
    setInterval(function(){
        res.write(
            currentTime.getHours()
            + ':' + 
            currentTime.getMinutes()
            + ':' +
            currentTime.getSeconds()
        );
    },1000);
}).listen(8000);

HTML:


    
        Testnode
    

    
        
        Server time:  

        
        

        
        
    

Используя этот метод я ничего не возвращаю, пока я не звоню close(). Это возможно, или я должен пойти с долгим подходом опроса вместо этого, где я вызываю функцию загрузки снова, поскольку каждый входит?

42
задан alex 10 November 2017 в 16:04
поделиться

1 ответ

Возможно. Просто используйте response.write () несколько раз.

var body = ["hello world", "early morning", "richard stallman", "chunky bacon"];
// send headers
response.writeHead(200, {
  "Content-Type": "text/plain"
});

// send data in chunks
for (piece in body) {
    response.write(body[piece], "ascii");
}

// close connection
response.end();

Возможно, вам придется закрывать и повторно открывать соединение каждые 30 секунд или около того.

РЕДАКТИРОВАТЬ : это код, который я на самом деле тестировал:

var sys = require('sys'),
http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    var currentTime = new Date();
    sys.puts('Starting sending time');
    setInterval(function(){
        res.write(
            currentTime.getHours()
            + ':' +
            currentTime.getMinutes()
            + ':' +
            currentTime.getSeconds() + "\n"
        );

        setTimeout(function() {
            res.end();
        }, 10000);

    },1000);
}).listen(8090, '192.168.175.128');

Я подключился к нему через Telnet, и он действительно выдает фрагментированный ответ. Но для использования в AJAX браузер должен поддерживать XHR.readyState = 3 (частичный ответ). Насколько мне известно, не все браузеры поддерживают это. Так что вам лучше использовать длинный опрос (или веб-сокеты для Chrome / Firefox).

РЕДАКТИРОВАТЬ2 : Кроме того, если вы используете nginx в качестве обратного прокси для Node, он иногда хочет собрать все фрагменты и сразу отправить их пользователю. Вам нужно настроить его.

25
ответ дан 26 November 2019 в 23:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: