Как лучше всего информировать браузер клиента о событиях (например, о новых сообщениях в чате)? - PullRequest
4 голосов
/ 25 июня 2010

Я думаю, что обычным способом является периодический "пинг" с сервером, но мне не нравится, как он выглядит слишком похоже на

"Is there anything new? - No"
"Is there anything new? - No"
"Is there anything new? - No"
"Is there anything new? - No"
"Is there anyt..."

Я видел другой подход, когда клиентзапрашивать новости, и сервер «сохраняет» запрос (например, с циклом ожидания), пока не появится что-то новое.Это круто, но я бы очень хотел услышать о других вариантах.

Ответы [ 5 ]

5 голосов
/ 25 июня 2010

К сожалению, на самом деле не существует кросс-браузерного механизма для передачи данных с сервера в браузер.Например, в 1995 году Netscape выпустила технологию push-сервера, которая использует специальный тип контента - multipart / x-mixed-replace, но, насколько я понимаю, IE не поддерживает его.WebSockets являются новыми, но поддержка только выходит.

Таким образом, вы вынуждены использовать имеющиеся инструменты, а это значит, что клиент должен спросить сервер, есть ли какие-либо новые данные - опрос.Опрос производится в 2 вариантах: опрос на интервале и длительный опрос .Когда вы опрашиваете интервал, вы просто делаете запрос к серверу каждые n секунд, запрашивая данные.Это довольно болтливо (простите за каламбур), если нет новых данных для возврата.Это то, о чем думают люди, когда вы говорите «опрос».

Другой вариант, длинный опрос, похож на то, что клиент отправляет запрос на сервер, чтобы узнать, есть ли новые данные.Но в этом случае сервер не отправляет ответ, пока ему нечего сказать.В этом случае клиент остается без ответа в течение неопределенного периода времени.Когда клиент в конечном итоге получает свой ответ, он анализирует ответ и немедленно делает другой запрос, который будет зависать до тех пор, пока не будет данных.

Оба эти подхода к опросу потребляют много HTTP-издержек, но если вы хотите использовать XHR, то этоэто единственный способ сделать это.

Слово предупреждения о длинном опросе: при работе с длинным опросом важно убедиться, что все ваши XHR работают асинхронно, в противном случае вы увидите блокировку потока пользовательского интерфейса браузера.up.


Если вы не заинтересованы в использовании AJAX, вы всегда можете использовать проверенный и проверяющий IFRAME, который никогда не завершает загрузку.В этом случае у вас есть IFRAME с журналом чата и другой IFRAME, содержащий вашу область сообщений.В этом случае сервер просто никогда не закрывает соединение для IFRAME, содержащего журнал чата.Вместо этого он просто отправляет сообщения чата в тело.

3 голосов
/ 25 июня 2010

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

Если вы хотите сделать это в JavaScript, альтернативы опросу через интервалы нет.

2 голосов
/ 25 июня 2010

Опции

  • Длинный опрос : держать запрос открытым до поступления данных. Получите данные и закройте соединение. Откройте новое соединение, чтобы снова получить данные. Для этого вам нужно иметь неблокирующее IO) для всех коммуникаций). Этот подход является наиболее простым для реализации. Вы даже можете использовать блокировку ввода-вывода, если на вашем сервере не много параллелизма.
  • HTTP-Streaming : не закрывать соединение при получении данных. Для того, чтобы это работало в кросс-браузерном режиме, вы должны сделать «взлом», чтобы он работал во всех браузерах.
  • XMPP через BOSH Для этого вы используете сервер XMPP и добавляете немного BOSH (XMPP через HTTP). Например, Prosody - это простой XMPP-сервер, который поддерживает BOSH. Далее вы могли бы написать на стороне клиента отличную библиотеку strophe.js.
  • Websockets : Я полагаю, это будет будущее, но сейчас поддержки браузера недостаточно, чтобы реально использовать ее для всех браузеров.
  • События, отправленные сервером : также довольно крутая функция html5. Этот протокол, на мой взгляд, проще, чем веб-сокеты. Это также пока широко не поддерживается всеми основными браузерами.
  • Вспышка : Вы также можете общаться с помощью вспышки, если хотите. В браузере должен быть установлен флэш-плагин, но это будет иметь место в большинстве случаев.

Какой самый лучший способ?

  1. По моему мнению, длинные опросы - это самый простой / лучший способ реализовать обмен сообщениями на основе событий по HTTP. это определенно не самая быстрая альтернатива, но каждый крупный браузер поддерживает ее и проще всего реализовать.
  2. Я думаю, что Websockets будет лучшей технологией (в будущем), но пока еще не получил широкого распространения в браузерах.
  3. Все вышеперечисленные технологии довольно хороши. У всех есть свои плюсы и минусы.
2 голосов
/ 25 июня 2010

Что вам нужно, это ajax push или reverse ajax . Есть много фреймворков на основе ajax, которые поддерживают push. В Java, например, nextapp echo2, или вы можете сделать снимок и для ape проекта .

0 голосов
/ 25 июня 2010

Если это делается с помощью JavaScript, на самом деле нет другого способа, кроме как пинговать сервер. Единственный вариант - сильно оптимизировать запрос, чтобы избежать бесполезного задания «вопроса».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...