AJAX и клиент-серверная архитектура с JavaScript - PullRequest
8 голосов
/ 15 января 2010

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

Теперь я понял, что с помощью XMLhttp вы можете в основном динамически обновлять свою страницу и отправлять / запрашивать информацию / действие на / с сервера. Так что это в основном будет охватывать клиентскую область.

Но чтобы завершить архитектуру клиент-сервер, серверу также необходимо отправлять / запрашивать информацию без запроса.

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

Ответы [ 5 ]

13 голосов
/ 15 января 2010

Есть несколько способов сделать это. Некоторые из них уже даны здесь ответы, но я хотел бы добавить еще несколько, а также свои мысли о них.

1. Опрос

Частые запросы отправляются на сервер для проверки новой информации. Это худший способ сделать это, но, вероятно, самый простой. Если на вашем сайте мало пользователей, возможно, стоит сделать это следующим образом.

Это может быть достигнуто с помощью setInterval(myFunction, n) в javascript для отправки XMLHttpRequests на сервер каждые n миллисекунд. Затем на сервере вы отвечаете на это своей новой информацией, когда она у вас есть, или некоторым сообщением, которое не подразумевает никакой новой информации.

2. Длинный опрос

Когда страница загружается, она запрашивает у сервера новую информацию. Сервер удерживает соединение открытым до тех пор, пока не будет чего отправлять обратно. Этот метод уменьшает объем используемого сетевого трафика, но увеличивает ресурсы, используемые на сервере. Вы можете использовать это для небольшого числа пользователей, но это не очень хорошо масштабируется.

Самый простой способ сделать это - заставить страницу, которая обрабатывает AJAX-запрос, просто дождаться появления новой информации и затем ответить. Это может связать много соединений на вашем сервере. Поэтому используйте с осторожностью.

3. COMET

COMET в основном длинный опрос, но сервер для него настроен правильно. Он знает, что эти соединения не «настоящие», и использует меньше ресурсов для их обработки. Это отличное решение для этой проблемы, но оно требует, чтобы сервер был явно настроен для этой цели. Существуют серверы COMET и надстройки COMET для других популярных серверов, но это потребует некоторой настройки, а иногда и денег.

Реализация этого в .NET не самая легкая вещь в мире. Вы можете платить за решения, пытаться найти чужой код, который делает что-то подобное, или попытаться написать его самостоятельно. Я не нашел достойных бесплатных решений для этого. Если у кого-то есть, пожалуйста, прокомментируйте.

4. РИА

Другим решением будет включение Flash, Silverlight или Java-апплета на вашу страницу. Люди часто делают это, используя объект 1x1, чтобы они могли использовать Flash или Silverlight для общения с сервером. Если вы не возражаете против добавления зависимости, это достойное решение. Если вы уже знаете Silverlight или Flash, это может быть относительно просто реализовать.

В Интернете вы можете найти учебники для каждого из этих вариантов.

5. Сетевые розетки

Если вы находитесь на переднем крае, вы можете заглянуть в Сетевые розетки . Он доступен только в последних сборках современных браузеров. Это было частью HTML5, но теперь это может быть его собственная спецификация. В любом случае, это означает, что старые браузеры не смогут справиться с этим. Но, если вы не возражаете ограничиться новейшими браузерами, вы можете использовать эту удивительную функцию.

Я считаю, что Chromium - единственный браузер, который в настоящее время поддерживает его. Однако для реализации этого в Firefox и WebKit ведется работа.

Я избавлю вас от противоречий и просто скажу, что это именно то, что вы хотите. Аннотация спецификации говорит сам за себя.

В этой спецификации определяется API, который позволяет веб-страницам использовать протокол веб-сокетов для двусторонней связи с удаленным хостом.

Специальное упоминание

Если вас интересует мир Node JS, вы не ошибетесь с Socket IO . Он будет реализовывать лучшие из доступных технологий для браузера.

Заключение

Лучшим вариантом является Socket.IO на Node JS. Однако, для решения ASP.Net, перейдите на COMET или веб-сокеты, если можете. В противном случае, использование Flash / Silverlight не страшно. Наконец, опрос и длительный опрос должны быть последними прибежищами. Вы всегда можете поддержать один из них, а затем переключиться на другой, если в браузере клиента его нет.

2 голосов
/ 15 января 2010

Да, вы можете использовать COMET .

1 голос
/ 15 января 2010

Клиент должен сообщить серверу, когда клиент-пользователь начинает печатать. У вас есть несколько вариантов здесь.

  1. Частые запросы от сервера о последних действиях. Это будет происходить для каждого пользователя, участвующего в чате. Тот же запрос можно использовать и для отправки пользовательской активности на сервер: «Джонатан печатает ...»

  2. Long-опрос. Это, по сути, запрашивает информацию с сервера, и сервер сохраняет соединение открытым, пока ему не будет чего отправлять обратно. Таким образом, ваши запросы сведены к минимуму, но ваши соединения остаются открытыми дольше.

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

0 голосов
/ 15 января 2010

Основываясь на архитектуре REST , на которой основана система html, роль серверов заключается в том, чтобы просто выступать в качестве ресурса для клиента. Я обобщаю, но есть инструменты для реализации этого типа действий на стороне клиента, а не на стороне сервера.

Вам лучше писать / использовать библиотеку, которая может периодически запрашивать обновления с сервера. Вы можете инкапсулировать эти типы запросов в объект JavaScript, который может инициировать события. Таким образом, ваш клиентский скрипт может действовать так, как будто он получает уведомление от сервера. Просмотрите некоторые распространенные вещи с помощью COMET , вы, вероятно, сможете найти некоторые инструменты, которые помогут вам на стороне клиента.

В HTML 5 есть некоторые пробные попытки использовать этот тип функциональности, но если вы хотите, чтобы ваше приложение работало в старых браузерах, вам лучше использовать более стабильные методы, такие как AJAX, запрашивающие обновления.

0 голосов
/ 15 января 2010

Вы можете использовать Silverlight для push-уведомлений. Посмотрите на PollingDuplexHttpBinding . Поскольку вы используете ASP.Net MVC, добавить Silverlight будет легко.

Посмотрите на эту страницу для получения дополнительной информации.

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