2010-12-05 4 views
2

Я пытаюсь создать серверное решение, которое периодически передает данные клиенту (без опроса на стороне клиента) через node.js. Соединение должно быть открыто постоянно и всякий раз, когда у сервера появляются новые данные, он подталкивает его к клиенту.node.js - передача данных клиенту - только один клиент может быть подключен?

Вот мой простой пример сценария:

var sys = require('sys'), 
http = require('http'); 
http.createServer(function (req, res) { 
    res.writeHead(200, {'Content-Type': 'text/html'}); 
    sys.puts('Start sending...'); 

    setInterval(function(){ 
     res.write("<script type='text/javascript'>document.write('test<br>')</script>"); 
    }, 10000); 
}).listen(8010); 

В основном это работает, но это, кажется, что только один клиент одновременно может быть подключен.

Если я открою http://127.0.0.1:8010/ с моим браузером, я вижу каждые 10 секунд новый выход. Но когда я открываю другую вкладку с тем же URL-адресом, она просто загружается навсегда. Только если я закрою первую вкладку, я получаю conent с сервера.

Что мне нужно для того, чтобы обслуживать несколько клиентов?

+0

Это странно. Согласно этой странице, он должен работать: http://blog.nemikor.com/2010/05/21/long-polling-in-nodejs/ – thejh 2010-12-05 20:35:40

+0

@thejh Hm, даже если я попытаюсь вернуть простой ответ с res. end() (без кометы, просто простой запрос-ответ) мне кажется, что клиенты должны ждать предыдущего, чтобы получить контент с сервера. Может быть, это проблема с ОС? Я запускаю node.js 0.3.2 на ubuntu vm-ware. – Max 2010-12-05 20:39:16

ответ

3

Это определенно ошибка, так как Браузер повторно использует одно и то же соединение из-за keep-alive и HTTP/1.1 и винтов узла.

Вы можете увидеть это на работе в Opera11, открыть страницу дважды, это точно такая же страница, используя то же самое соединение.

Curl и все, что не установлено Connection: keep-alive работает нормально, но браузеры не открывают одну и ту же страницу дважды. Хотя вы можете открыть «localhost: 8010» и «localhost: 8010/foo», и он будет работать на обеих страницах.

Примечание: Это влияет только на GET запросы, запросы POST работать нормально, так как нет никакого повторного использования соединения.

Я подал на это issue.

3

Вы должны использовать socket.io. Он обрабатывает весь тяжелый подъем для вас и представляет собой действительно классную библиотеку.

1

Будьте осторожны с этим!

node.js неблокирующий, но в то же время обрабатывает только 1 соединение за раз. То, что вы сделали, помещает узел в мертвое состояние, поэтому вы видите данные на втором клиенте, когда вы закрываете первый.

Смежные вопросы