Долгий опрос для более чем 1 соединения в одном браузере

Я пытаюсь реализовать метод длинных опросов с помощью NodeJS.

У меня есть этот базовый код, развернутый на сервере.

http = require('http');

function onRequest(request, response) {
    console.log('onRequest reached');
}

http.createServer(onRequest).listen(8080);
console.log('Server has started.');

При запросе localhost:8080 запускается onRequest. Когда это соединение активно, я запрашиваю ту же страницу на второй вкладке, но onRequest не запускается. Однако запрос той же страницы из другого браузера срабатывает onRequest, в то время как первое соединение все еще «долго опрашивается».

Есть ли ограничения в браузерах? Как и почему это происходит? Как этого избежать?

Кстати. Я пытаюсь реализовать длинный чат с опросом и систему уведомлений. На самом деле запросы должны быть сделаны вызовом AJAX.


person Tigran Tokmajyan    schedule 06.07.2012    source источник


Ответы (1)


Возможно, браузер ожидает ответа. Попробуйте сразу отправить только заголовки:

function onRequest(request, response) {
    response.writeHead(200, {'Content-Type': 'text/html'});
    console.log('onRequest reached');
}

Еще один совет: если вы собираетесь использовать длительный опрос, я предлагаю вам изучить события, отправленные сервером. Для этого существует довольно широкая поддержка браузеров, а также есть polyfill для старых браузеров. Вот пример на CoffeeScript, показывающий, как вы можете отправлять события с сервера node.js.

person Linus Thiel    schedule 06.07.2012
comment
Отправка заголовков сразу не помогает. - person Tigran Tokmajyan; 06.07.2012
comment
Хорошо. Вот в чем дело: согласно спецификации HTTP/1.1, в браузере должно быть открыто максимум 2 соединения одновременно с одним и тем же сервером. Я не уверен, связана ли ваша проблема с первым окном, запрашивающим / и /favicon.ico, или с чем-то еще... В любом случае, это большой недостаток при длительном опросе. - person Linus Thiel; 06.07.2012
comment
Ой. Я также читал об ограничении в 2 соединения. Но забыл про /favicon.ico :) Теперь мне нужен способ избежать этого. Что делает Facebook со своим чатом? - person Tigran Tokmajyan; 06.07.2012
comment
Я предполагаю, что Facebook использует WebSockets с запасными вариантами. Если вам нужно что-то более надежное, вы можете изучить очень популярный модуль socket.io. Это дает вам WebSockets, long-polling, FlashSocket, опрос iframe в аккуратном интерфейсе. Я все еще думаю, что вам следует изучить события, отправленные сервером, поскольку они намного проще и имеют лучшую поддержку браузера. Однако это зависит от варианта использования, поскольку SSE — это только сервер -> браузер. - person Linus Thiel; 06.07.2012
comment
Если вам нужна система, которая автоматически разделяет и мультиплексирует одно и то же соединение на нескольких вкладках браузера, попробуйте Lightstreamer. Чтобы увидеть живую демонстрацию этого поведения, перейдите на страницу запуска чата ( lightstreamer.com/demos#ChatDemo ) и нажмите несколько раз, чтобы запустить демонстрацию. - person Alessandro Alinone; 07.07.2012