Техника на стороне клиента для Comet - PullRequest
4 голосов
/ 11 марта 2012

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

В частности, я пытаюсь ответить на следующие вопросы:

  1. Как определить в JavaScript, что соединение успешно установлено.Например,если бы я использовал метод длинного опроса тега сценария, и браузер никогда не смог бы добраться до сервера, как бы я узнал?
  2. При длительном опросе, если от сервера нет ответа, браузер в конечном итоге попадет всостояние "истекло время ожидания".Как я могу обнаружить это в Javascript и восстановить длительный опрос?
  3. Как мне убедиться, что моя техника работает в браузерах?По сути, я хочу знать правильное сочетание методов (скрипт-тег, xhr и т. Д.), Которое бы охватывало большинство браузеров.

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

Спасибо.

Ответы [ 2 ]

1 голос
/ 12 марта 2012
  1. Если транспорт является видом длинного опроса, вы не можете этого знать. Я столкнулся с той же проблемой, когда проектировал транспорт с длинным опросом в сокете jQuery, потому что объект сокета запускает событие open при установлении соединения. Поэтому я добавил правило, согласно которому сервер должен немедленно реагировать, когда сервер получает первый длинный запрос на опрос, чтобы сообщить клиенту, что сервер принимает этот запрос и устанавливает соединение. К вашему сведению, если первый длинный запрос опроса не завершен в течение указанного времени ожидания, объект сокета инициирует событие close.

  2. Я согласен с ответом @ Hersheezy. Просто попробуйте еще раз.

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

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

Спасибо.

1 голос
/ 11 марта 2012

Вот как моя компания решает эти проблемы:

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

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

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

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

Удачи !!

...