Установите одно двустороннее соединение между клиентом и сервером, что означает, что клиент должен только отправлять запрос на сервер, и сервер обработает его. Может, ожидая этого времени, чтобы продолжить выполнение другой работы, весь процесс асинхронно. В этой серии учебных пособий пользователи будут направлены на использование нового API-API-анализа JSON (JSR-353) в Java EE 7 в контейнерной стеклянной рыбке 4, а также используйте JQUERY и Bootstrap в комбинации. Эта статья требует, чтобы читатели обладали определенным базовым принципом знания HTML 5 WebSocket.
Визуализации
Давайте сначала посмотрим на визуализации после завершения этого учебника, как показано ниже:
Подготовка
Мы используем JDK 7 и Mavn 3 для строительства библиотеки.
<properties> <endorsed.dir> $ {project.build.directory}/endorsed </endorsed.dir> <project.build.sourceencoding> utf-8 </project.build.so urseencoding> </properties> <segy-> <Depective> <groupid> javax </GroupId> <ArtifactId> javaee-api </artifactid> <sersion> 7.0 </version> <cracpe> предоставлен </scope> </degulity> </de pendencies> <buld> Плагины> <blicin> <groupid> org.apache.maven.plugins </GroupId> <strifactid> maven-compiler-plugin </artifactid> <sersive> 3.1 </version> <configuration> <sou rce> 1.7 </source > <Target> 1.7 </target> <compilerarguments> <endorsedDirs> $ {endorsed.dir} </endorsedDirs> </compilerarguments> </configuration> </placin> <blicin> <groupd> org.apache.maven.plugins </GroupId> <artifactId> mavenwar-plugin </artifactid> <sersion> 2.3 </version> <configuration> <fautyOnmissingWebxml> false </failOnmissingWebxml> </configurati On> </placin> <bricin> <groupId> org.apache.
В то же время, чтобы использовать Glassfish 4, необходимо добавить следующие плагины:
Плагин> <groupid> org.glassfish.embedded </GroupId> <Artifactid> maven-embedded-Glassfish-plugin </artifactid> <serse> 4.0 </version> <confi Guration> <guteprefix> incedded-Glassfish </oalprefix> <pplice> $ {basedir}/target/$ {project.artifactid}-$ {project.version} .war </app> <autodelete> true </autodelete> <port> 8080 </port> <name> $ { Project .ArtifactId} </name> <contextroot> hascode </contextroot> </configuration> <ferainations> <cessuration> <age> <galt> deploy </ogle> </ogle> </exe cutition> </recemination> </ плагин>
Настройка конечной точки WebSocket
Давайте сначала рассмотрим код сервера WebSocket следующим образом, а затем выполним дальнейший анализ:
Пакет Com.hascode.tureail; Websocket .onopen; Decoders = Chatmessagedecoder.class) Общедоступный класс Chatendpoint {private Final Logger = logger.getLogger (getClass (). getName ()); {log. String Room = (String) session.getUserProperties (). Get ("Room"); ) .Get ("Room")) {S.GetBasicRemote (). SendObject (Chatmessage); }}
В следующем анализе приведенный выше код:
Используйте @serverendpoint, чтобы определить новую конечную точку, где значение указывает URL и может использовать параметр Pathparams, так же, как оно используется в JAX-RS.
Следовательно, значение "/CHAT/{Room}" позволяет пользователю подключаться к чату через следующий URL: WS: //0.0.0.0: 8080/hascode/chat/java
Значение в скобках (то есть в комнате) может быть введено в качестве параметра в методе обратного вызовов жизненного цикла конечной точки с помощью javax.websocket.server.pathparam.
Кроме того, мы хотим использовать кодированный и декодированный класс, потому что мы используем класс DTO, который используется для передачи данных на стороне сервера и клиента.
Когда пользователь впервые подключается к серверу и входит в номер комнаты, чтобы войти в чат, номер комнаты будет введен в представление в виде параметров, а значение сохраняется на карте свойств пользователя с помощью сеанса. getuserproperties.
Когда участник чата отправляет информацию на сервер через соединение TCP, он проходит через все открытые сеансы, каждый сеанс связан с указанной чата -комнатой и получает кодированную и декодированную информацию.
Если мы хотим отправить простую текстовую информацию или информацию в двоичном формате, мы можем использовать session.getBasicRemote (). SendBinary () или Session.getBasicRemote (). SendText ()
Далее, давайте посмотрим на код, используемый для представления объекта передачи информации (DTO: объект передачи данных), следующим образом:
Пакет Com.hascode.tutorial;
Преобразование сообщений чата
В этом приложении будет написан класс кодировки и декодирования для преобразования информации о чате и форматом JSON.
Давайте сначала рассмотрим реализацию класса декодирования, который будет преобразовать информацию о чате, передаваемую на сервер в класс объектов Chatmessage. Здесь спецификация Java API для обработки JSON (JSR353) используется для преобразования информации о формате JSON в классы объектов.
Пакет Com.hascode.tutorial; Импорт javax.websocket.endpointconfig; Throws Decodexception {Chatmessage Chatmessage = new Chatmessage (); getString ("Sender");
Давайте посмотрим на код класса кодирования.
Пакет com.hascode.tutorial; void init (final endpointConfig config) {} @Override public void destress () {} @Override public String Encode (final Chatmessage Chatmessage) Throws Enco deexception {return json.createObjectBuilder () .Add («Сообщение», Chatmessage.getMessage () ) add ("Sender", Chatmessage.getSender ()) .Add ("
Здесь вы можете увидеть мощную силу JSR-353.
Создайте простого клиента через начальную загрузку и javacsript
Наконец, мы всесторонне используем знаменитую начальную загрузку, jquery framework и javascript для разработки простого клиента. Мы создаем новый файл index.html в каталоге src/main/weapp, и код выглядит следующим образом:
<! Doctype html> <html lang = "en"> <Head> [..] <Script> var Wsocket; var $ message; ); .message + '</td> </tr>'); "," Sender ":" ' + $ nickname.val () +' "," получен ":" "} '; wsocket.send (msg); $ message.val (' '). Focus ();} Функция ConnectToChatserver () {room = $ ('#room: select ’). val (); $ CHATWINDOW.Empty (); function () {$ chicname = $ ('#chicname'); ; $ ickname.focus (); + $ chicname.val () + "@" + room); }); ) :::::: ::::::::: ::::::::::::::::: :::::::::: Форма> <h2> Войдите в чате в </h2> <label for = "lickname"> никнам </label> <input type = "text" Placeholder = "lickname" id = "lickname"> <Div> <label for = "CHATRoom"> чат </ label> <select size = "1" id = "чат"> <опция> arduino </:::::::::::::::::::::: ::::::::::::::::: ::::::::::::::::: ::::: :: option> <опция> java </option> <опция> groovy </option> <опция> scala </option> </select> </div> <button Type = "Отправить" id = "Enterroom "> Войти в </button> </form> </div> <!-/container-> <div> <form id =" do-chat "> <h2> </h2> <таблица id =" Ответ "> </ table> <fieldset> <Legend> Введите ваше сообщение .. </ Legend> <div> <input type =" text "Placeholder =" Ваше сообщение ... "ID =" Сообщение "Стиль =" Высота : 60px "/> <input type =" Отправить "value =" Отправить сообщение "/> <button Type =" button "id =" Leave-room "> оставить комнату </button> </div> </fieldset> < /form> </div> </body> </html>
В приведенном выше коде, пожалуйста, обратите внимание на следующие моменты:
Если вы хотите позвонить в WebSocket на стороне JavaScript, вы должны инициировать соединение следующим образом: ws: // ip: port/context_path/endpoint_url Eg WS: //0.0.0.0: 8080/hascode/chat/java
Метод создания подключения к WebSocket очень прост, используя var Wsocket = new WebSocket ('ws: //0.0.0.0: 8080/hascode/chat/java');
Чтобы получить информацию, возвращаемую с сервера, вам нужно только установить соответствующий метод получения возвратной информации в функции обратного вызова wsocket.onmessage.
Отправьте сообщение WebSocket на сервер, используя wsocket.send (), где сообщения, которые можно отправить, могут быть текстовыми или двоичными данными.
Чтобы закрыть соединение, используется wsocket.close ().
Наконец, мы развертываем код через пакет MVN-пакета в Embedded Glassfish: запустите, а затем мы можем увидеть эффект экрана в начале этой статьи.
Приведенное выше - чат, внедренная с использованием Javaee7, WebSockets и Glassfish4.