Методика клиентской стороны для кометы

Я пытаюсь придумать практическую реализацию на стороне клиента (JavaScript) для Comet. http://en.wikipedia.org/wiki/Comet_(programming)) говорит об этой теории, но мне сложно найти попытку найти реализацию, которая работает. Я понимаю, что здесь есть и хорошие требования к серверу, но меня интересует только его клиентская часть.

В частности, вопросы, на которые я пытаюсь ответить, -

  • Как определить в JavaScript, что соединение было успешно создана. Напр. если бы я использовал тег script длинный метод опроса и браузер никогда не сможет добраться до сервера, как я знаю?
  • При длительном опросе, если нет ответа от сервера, браузер, в конечном счете, попадает в состояние "запрошенное время ожидания". Как я обнаружил это в Javascript и восстановил длительный опрос?
  • Как обеспечить, чтобы моя техника работала в браузерах? В основном я хочу знать правильное сочетание методов (тег script, xhr и т.д.), который охватывают большинство браузеров.

Я пробовал искать инфраструктуру Comet, но каждая найденная мной инфраструктура (CometD, Atmosphere) и т.д. поставляются с реализацией на стороне сервера и делают клиентскую сделку прозрачной для пользователя. Тем не менее я пытаюсь выяснить, как они достигают клиентского подхода. У меня есть собственная реализация сервера и протокол.

Спасибо.

2 ответа

Ниже приведена информация о том, как моя компания решает эти проблемы:

1), если вы можете установить соединение без немедленного получения ошибки, вы должны предположить, что соединение установлено. Если вы не получили ответ немедленно (плохо или иначе), вам просто нужно предположить, что он работает... делает для некоторой жесткой клиентской стороны домашнего хозяйства, поэтому важно использовать идентификаторы последовательностей разумно.

2) Просто попробуйте снова сразу. Обычно сервер отключается до того, как клиент выполнит и отправит код ошибки, сообщающий вам, что это произошло. Просто убедитесь, что вы используете что-то разумное, как 20 секунд для вашего времени опроса на стороне сервера.

3) Вы должны переходить к другому доменному имени, чем другие запросы на один и тот же служебный компьютер, и использовать jsonp. Например, если ваша страница размещается на example.com, обычно существует субдомен chat.example.com, поскольку большинство браузеров разрешают только 3 или 4 открытых соединения одновременно с тем же именем домена. Jsonp необходим из-за той же политики происхождения. Кроме этого: тест, тест, тест.

Ryan Dahl (создатель node.js) имеет очень простой клиент/сервер чата, реализованный здесь: https://github.com/ry/node_chat

Удачи!


  • Если транспорт является своего рода длинным опросом, вы не можете этого знать. У меня возникла такая же проблема, когда я разработал длинный опросный транспорт в JQuery Socket, потому что объект сокета запускает событие open при установлении соединения. Поэтому я добавил правило, что сервер должен немедленно ответить, когда сервер получает первый запрос на длительный опрос, чтобы сообщить клиенту, что сервер принимает этот запрос и устанавливает соединение. Для вашей информации, если первый длинный запрос опроса не завершен в указанный таймаут, объект сокета запускает событие close.

  • Я согласен с ответом @Hersheezy. Повторите попытку.

  • Тест - это ответ. Комбинация транспортов опирается на окружающую среду вашего приложения-браузера и серверного приложения. Например, если вы будете поддерживать IE6, но не будете поддерживать междоменные подключения и мобильные устройства, вам не нужно использовать длинный опросный транспорт. Этого достаточно для использования событий WebSocket, Server-Sent Events и HTTP Streaming, а если вы не можете подготовить сервер WebSocket, то правильными транспортными средствами будут события и потоки, отправленные сервером.

Я создаю jQuery Socket, который является агонистической библиотекой JavaScript для JavaScript и предоставляет сокет для приложений на базе браузера. Возможно, это было бы полезно для вас. В настоящее время это предварительная альфа-версия, и я пишу документ, посвященный обработке на стороне сервера.

Спасибо.

licensed under cc by-sa 3.0 with attribution.