5 авг. 2015 г.

GWT библиотека для Websocket

Сделал небольшую библиотеку, чтобы использовать протокол websocket в gwt приложении. Проект на гитхабе

В сети существуют несколько подобных решений, для использования websocket в gwt, но мне было важно то, чтобы библиотека обеспечивала только клиентскую часть приложения. Сервер может быть реализован как угодно, единственное условие: использование json.

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

О библиотеке

Сама библиотека предельно проста, она является мостом между sockjs и gwt. Sockjs - это мощная библиотека на javascript, которая обеспечивает общение по протоколу websocket. Более того, если браузер не поддерживает этот протокол, то библиотека эмулирует его через обычные запросы (сам не пробовал, но так написано в описании). 

Как подключить
Если вы пользуетесь сборщиком, то добавьте следующую зависимость в ваш проект:

Gradle:
 compile group: 'ru.kosdev.gwtwebsocket', name: 'gwtwebsocket', version: '1.1'
Maven:
<dependency>
<groupId>ru.kosdev.gwtwebsocket</groupId>
<artifactId>gwtwebsocket</artifactId>
<version>1.1</version>
</dependency> 
В gwt.xml файле модуля, в котором вы ходите использовать websocket нужно добавить строку:
<inherits name="ru.kos.gwtwebsocket.WebSocket"/>
Теперь можно приступить к использованию.  

Как пользоваться 
Объяснять удобнее на примере. Поддержим протокол, где серверу отправляется число a, а возвращается строка str.
Для начала нужно создать интерфейсы Data Transfer Objects - объекты
public interface ClientData { Integer getA(); void setA(Integer a);}
public interface ServerData { String getStr(); void setStr(String str);}
Это довольно необычно: создавать интерфейсы dto, но необходимо autobean фреймворком, который используется для конвертации объектов в json. Напомню, что в gwt нет рефлексии, поэтому конвертация в json не так прозрачна, как хотелось бы.
Затем нужно создать фабрику для генерации dto. Как видно по коду, это все также делается для autobean для конвертации в json.     
public interface DtoFactory extends AutoBeanFactory {
 AutoBean<ClientData> clientData();
 AutoBean<ServerData> serverData();
}
Нужно настроить конфигурацию websocket компонента:
WSConfiguration<ClientInfo, ServerInfo> wsConfiguration = new WSConfiguration<ClientInfo, ServerInfo>()
 .withUrl("http://127.0.0.1:8080/websocketservice") //ws url
 .withSubscribeUrl("/topic/info") //url to subsribe
 .withGClass(ServerData.class) //class to Get data from server
 .withSClass(ClientData.class) //class to Send data to server
 .withAutoBeanFactory(GWT.<DtoFactory>create(DtoFactory.class));
 ;
И создать сам компонент. Метод connect осуществляет соединение с сервером. После этого возможна отправка сообщений и начнется обработка входящих сообщений (если есть callback).

 WSComponent<ClientData, ServerData> wsComponent = new WSComponent<>(wsConfiguration);
 wsComponent.connect();
Установить callback (обработчик входящих сообщений) очень просто:

 wsComponent.setCallback(new WSCallback<ServerInfo>() {
    @Override
    public void onMessage(ServerData serverData) {
        Window.alert(serverData.getStr());
    }
 }) 
Отправка сообщения выполняется в одну строку:
wsComponent.send("app/say", new ClientData());
Здесь можно увидеть пример использования.

Комментариев нет :

Отправить комментарий