Я хочу знать, возможно ли передать данные потоком от сервера до клиента с 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()
. Это возможно, или я должен пойти с долгим подходом опроса вместо этого, где я вызываю функцию загрузки снова, поскольку каждый входит?
Возможно. Просто используйте 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, он иногда хочет собрать все фрагменты и сразу отправить их пользователю. Вам нужно настроить его.