Статьи

HTML5 WebSockets в ColdFusion 10: полная схема рабочего процесса

Веб-сокеты HTML5 представляют собой следующую эволюцию веб-коммуникаций. WebSocket — это дуплексный, двунаправленный канал связи, который работает через один сокет TCP. Это стало стандартом для создания веб-приложений в реальном времени. В ColdFusion 10 предусмотрен уровень обмена сообщениями, который реализует протокол Web Socket. Это позволяет создавать приложения, основанные на модели издателя / подписчика, а также приложения, основанные на модели подписчика, в которых возможна передача с сервера.

Модель издателя / подписчика.

В этом методе, основанном на широковещании, издатель публикует сообщение, а подписчик использует его. Подписчик подписывается на канал, на который издатель публикует сообщение. Подписчик может подписаться на несколько каналов и использовать данные, отправленные по каналу. Для реализации подхода на основе широковещания в ColdFusion вы можете указать детали канала в файле Application.cfc, использовать новый тег — cfwebsocket для создания веб-сокета и затем отправить получать и управлять соединением с помощью различных функций JavaScript. Application.cfc:

 PubSub

component {
    this.name = "WebSocketAPP";
    this.wschannels = [{name="channel1"},{name="channel2"},{name="channel3"}]; 
}

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

Создание

веб-сокета : для создания веб-сокета используется тег cfwebsocket: 

<cfwebsocket name="socket" 
onMessage="messageHandler" 
onOpen="openHandler" 
onClose="closeHandler" 
onError="errorHandler" 
subscribeTo="channel1,channel2">

Тег cfwebsocket установит соединение с сервером WebSocket, и сервер ответит сообщением «Добро пожаловать»; подтверждение издателю или подписчику, что соединение установлено. Как видно из приведенного выше фрагмента кода, указаны различные обработчики. Это функции JavaScript, которые пользователь должен реализовать. Обработчик onMessage (messageHandler в коде) вызывается, когда сервер отвечает сообщением или когда данные принимаются по подписанному каналу. Полный рабочий процесс показан ниже:

Функции JavaScript:

после установления соединения с сервером объект websocket используется для управления соединением. Вот список функций JavaScript (обратите внимание, что это не полный список, упоминаются только те, которые относятся к примеру):

openConnection

По умолчанию соединение с сервером устанавливается, когда на странице указан тег cfwebsocket. Если пользователь решает закрыть соединение (см. Функцию closeConnection ниже), а затем установить снова, то эта функция должна вызываться для объекта сокета. Пример:

socket.openConnection();

isConnectionOpen

Эта функция используется для проверки, установлено ли соединение с сервером. Возвращает логическое значение true, если соединение установлено, или false, если соединение закрыто. Пример:

socket.closeConnection();

подписка

Вместо указания каналов для подписки в атрибуте subscribeTo тега cfwebsocket можно использовать функцию JavaScript «подписка» для подписки на канал. Эта функция может принимать два аргумента — subscriberInfo и messageHandler. Информация о подписчике может включать в себя связанные с подписчиком данные, такие как идентификатор, имя, возраст в структуре. Если указана функция messageHandler, то всякий раз, когда сообщение принимается через канал, вызывается messageHandler. Пример:

socket.subscribe(“channel1”,{name: ‘Sagar’, id: ‘888’}, channelHandler);

отписаться

Функция «отписаться» используется для отмены подписки на канал. Как только пользователь отписывается от канала, сообщения из канала больше не доставляются клиенту. Пример:

socket.unsubscribe(“channel1”,{name: ‘Sagar’, id: ‘888’});

Опубликовать

Издатель может отправлять данные через канал, используя метод публикации. Сервер подтверждает это действие, отправляя подтверждение издателю. Третий аргумент метода публикации — это структура, содержащая информацию об издателе. Опять же, это необязательный аргумент. Пример:

socket.publish(“channel1”,”message_here”,{name: ‘Publisher’, id: ‘222’});

closeConnection

Пользователь может закрыть соединение, вызвав функцию ‘closeConnection’ для объекта сокета. Эта функция закроет соединение с сервером, и пользователь не получит никаких сообщений. Если пользователь хочет открыть соединение, то должна быть вызвана функция openConnection. Пример:

socket.closeConnection();

Рабочий пример

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