JavaScript. WebSocket — технология постоянного соединения, или зачем нам чистить рыбу, когда можно грызть камни.

Все-таки решил продолжить цикл статей касательно WEB-технологий. Решил я задеть такую необходимую в определенных ситуациях технологию, как WebSocket, которую недавно пришлось использовать на практике.

Немногие слышали о данной технологии, и уж тем более немногие решаются её использовать. Почему? Опишу это ниже.
Итак, что представляет из себя данная технология. Это протокол, организованный поверх TCP-соединения, поддерживающий двунаправленную передачу данных (full duplex), что дает нам возможность передать сообщение браузеру от сервера, без передачи запроса от браузера к серверу.

Вопрос — который часто задают — «Зачем он нужен, если есть AJAX?». И вправду — для разовой передачи от клиента серверу — AJAX подходит лучше (открыл соединение-передал-закрыл и забыл). А вот для организации того же чата или отслеживания активного online-соединения ? Решают обычно задачу так — опрашивают сервер каждые 3 (1,2,3,4,5…) секунды, на получение новых сообщений. Разумеется, если сервер еще и на PHP — то он будет каждый раз еще и обращаться к базе. Т.е. mysql будет часто производить поиск, причем в 80% случаев — вхолостую. А если активных участников человек 40, например, та же конференция? Тогда будет просто нещадная постоянная бомбежка сервера. А как определить что пользователь вышел в offline ? Куки (с коротким временем хранения), сессии, и т.д… Все это грузит еще и файловую систему. Это крайне нерациональное использование ресурсов сервера, сетевого канала (при каждом запросе — посылаются множество заголовков, причем не маленьких).

Вот в таком случае, webSocket-ы могут сильно выручить. Достаточно просто соединиться с сервером. Сервер, получив сообщение от одного из участников, имеет возможность сразу же (практически real-time) отправить это сообщение другим участникам соединения, а копию сбросить в базу (или держать в памяти какое-то время, чтобы сбрасывать по несколько сообщений разом). Если один из участников соединения  обрывает связь — об этом сервер сразу же узнает, и может оповестить других участников. Никаких лишних запросов! Все просто, прямо, и так, как должно быть! webSocket-ов может быть открыто несколько, что позволяет организовывать несколько разных соединений с разными серверами.

Какие есть нюансы. Ну, во-первых — поддержка браузерами. Любимый и обожаемый многими Internet Explorer — как обычно, как обычно, нас подкачал, в плане поддержки данной технологии.  Поддержка есть только у более серьезных и современных браузеров. Но как ни странно — умельцы уже сделали инструмент, решающий эту проблему во всех браузерах — это библиотека Socket.io: http://socket.io/ . Как она работает — эта тема достойна отдельной статьи.

Далее — пока не утвердилась четко окончательная версия протокола. Причем описания новых версий подразумевают отказ от обратной совместимости. Но причина понятна — разработчики стандарта стараются его сделать максимально безопасным.

Далее — в связи с популярностью PHP — я готов расстроить — он как раз и не подойдет для работы с данной технологией в силу поддержки постоянного соединения (no CGI). Просто идеально подходит для поддержки постоянного соединения node.js (nodejs.org).

В-третьих — требуется организация какой-то командной работы, чтобы отделять параметры. Идеально для передачи данных подходит JSON.

В-четвертых — еще не совсем понятна ситуация с брандмауэрами.

 

Вопрос — «и что со всем делать?». Ответ — «Что хотите, то и делайте».

Для сайтов — пока рано использовать. Хотя для кроссбраузерности — есть Socket.io.

Для интранет приложений, где есть возможность предъявлять требования к браузерам — вполне уже возможно использовать. Конференции в вебе, более менее серьезный онлайн, тесное взаимодействие, оперативная работа с данными, возможность влиять серверу (именно по его требованию) на клиентское приложение.

Примеры с кодом приводить не стал — в интернете их полно. Но если кто хочет подробнее разобраться в этом, могу сбросить пару примеров.

One Response to “JavaScript. WebSocket — технология постоянного соединения, или зачем нам чистить рыбу, когда можно грызть камни.”

  1. Alex:

    Придставим есть задача: реализовать одновременно два чата. Чаты полностью изолированны друг от друга (свои участники и проч.). Как быть с сокетами в этом случае? Открывать свой соке для каждого чата отлельно или (второй вариант) использовать пространства имен (socket.io / node.js) или есть еще варианты?
    Спасибо.

Коментарии