Лучший способ для клиента получать сообщения чата с сервера?

Я создаю приложение чата с помощью JavaScript, jQuery, MySQL и PHP, и мне просто интересно, как лучше всего клиенту получать сообщения чата с сервера? Мои текущие потенциальные кандидаты — это опрос, длинный опрос, события, отправленные сервером HTML5 (EventSource) и веб-сокеты. Какой из них будет самым быстрым (мгновенные сообщения) и наиболее эффективным методом (по возможности также объясните, почему)? Или, если есть лучший способ сделать это, пожалуйста, подробно опишите его в ответе.

Кроме того, я также просмотрел Node.js + Socket.IO, но документация и пример кода, которые я нашел для них, не имели для меня ни капли смысла.

Наконец, я использую XAMPP в качестве локального сервера и MySQL в качестве базы данных для этого приложения.

Любая помощь будет оценена по достоинству.


person Kevin Pei    schedule 07.04.2013    source источник
comment
IRC - это путь.   -  person hakre    schedule 08.04.2013
comment
@hakre Боюсь, я не могу понять, что вы имеете в виду под IRC. Быстрый поиск говорит мне, что это Internet Relay Chat, но дальше этого я не продвинулся. Кажется, я не могу найти никакой документации по этой технологии/протоколу/что бы это ни было. Не могли бы вы указать мне правильное направление со ссылкой?   -  person Kevin Pei    schedule 08.04.2013
comment
@kpsuperplane: IRC действительно является ретрансляционным чатом в Интернете. Это протокол. Конечно, есть статья Википедии. Технические подробности см. в RFC. Есть множество реализаций; нет назначенного «официального». Вам нужно будет посмотреть, какие у вас есть варианты, точно так же, как вы могли бы просмотреть различные веб-серверы или почтовые серверы.   -  person icktoofay    schedule 08.04.2013
comment
@icktoofay Спасибо за этот комментарий. Это помогло мне немного лучше понять IRC. hakre Я не особо верю, что IRC принесет мне много пользы. Помимо того факта, что существует несколько реализаций, как указал icktoofay, это полноценная система чата, а не метод связи между клиентом и сервером. Также кажется, что для этого IRC требуется несколько серверов, которых у меня нет в данный момент. Спасибо за ваше предложение.   -  person Kevin Pei    schedule 08.04.2013
comment
@kpsuperplane: en.wikipedia.org/wiki/Internet_Relay_Chat — это делается с помощью TCP/IP — как HTTP.   -  person hakre    schedule 08.04.2013


Ответы (1)


По совпадению, перечисленные вами варианты перечислены в порядке эффективности, от наименее к наибольшему.

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

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

COMET (не упоминается) лучше, чем длинный опрос, но хуже, чем события, отправленные сервером. Он также должен время от времени переподключаться из-за того, что большинство веб-серверов и браузеров имеют тайм-ауты при подключении, но соединения не нужно восстанавливать всякий раз, когда отправляется сообщение. Как и при длительном опросе, при повторном подключении может быть задержка, но в остальном оно обычно происходит мгновенно.

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

WebSockets, безусловно, лучший из всех этих вариантов; ему нужно только одно соединение, и оно дуплексное: вы можете не только получать сообщения через него, но вы также можете отправлять сообщения через него, вместо того, чтобы подключаться к серверу отдельно каждый раз, когда вы хотите отправить сообщение. В отличие от событий, отправленных сервером, для этого требуется дополнительный код: он не выполняет автоматическое повторное подключение в случае разрыва соединения, а реализации на стороне сервера обычно более сложны. Я также не уверен, что вы можете использовать его с Apache/XAMPP. Это мгновенно.

Socket.io — это библиотека, которая поддерживает (почти?) все эти и некоторые другие (например, флэш-сокеты) и абстрагирует их за красивым API, поэтому вам не нужно иметь дело с особенностями поддержки браузерами каждого из них. . Он так же быстр, как транспорт, который он использует, что зависит от браузера, в котором он работает. Это также может сократить количество кода, который вам нужно написать. Однако, если это слишком сложно для вас и вас не интересуют старые браузеры, в этом нет необходимости. Кроме того, он очень любит работать сам по себе. Возможно, вы сможете заставить XAMPP работать с ним через прокси, но опять же, я не знаю, можно ли настроить Apache для пересылки на него веб-сокетов.

person icktoofay    schedule 08.04.2013
comment
Спасибо за подробный ответ, 70% ответа на мой вопрос. Остальные 30% — это простой список параметров с точки зрения скорости (мгновенная — задержка/тайм-аут) и объяснение, если это возможно. Если вы можете добавить это, я отмечу это как ответ. - person Kevin Pei; 08.04.2013
comment
Спасибо за исправленный ответ. Похоже, я перехожу на SSE. - person Kevin Pei; 08.04.2013