Establezca una sola conexión bidireccional entre el cliente y el servidor, lo que significa que el cliente solo necesita enviar una solicitud al servidor, y el servidor la procesará. puede mientras espera este momento para continuar haciendo otro trabajo, todo el proceso es asíncrono. En esta serie de tutoriales, los usuarios se guiarán a usar la nueva API JSON Parsing (JSR-353) en Java EE 7 en Container Glassfish 4, y usar JQuery y Bootstrap en combinación. Este artículo requiere que los lectores tengan un cierto conocimiento básico de Principio de HTML 5 WebSocket.
Representaciones
Primero veamos las representaciones después de completar este tutorial, como se muestra a continuación:
Preparación
Estamos usando JDK 7 y Mavn 3 para construir la biblioteca.
<Properies> <Endorsed.dir> $ {Project.Build.Directory}/Endorsed </ENDORSED.DIR> <Project.Build.SourceEncoding> UTF-8 </project.Build.SO URCEEncoding> </Properties> <Entextencies> <Spendency> <ProupId> javax </proupid> <artifactId> javaee-api </artifactid> <versión> 7.0 </versión> <cope> proporcionó </cope> </pendency> </de Pendencies> <eding> <100. Plugins> <glugin> <uproupid> org.apache.maven.plugins </groupid> <artifactid> maven-compiler-plugin </arfactid> <versión> 3.1 </versión> <figuration> <sou rce> 1.7 </ > <Atgast> 1.7 </gast> <SpilerarGuments> <NDORSEDDIRS> $ {Endorsed.dir} </arDorsedDirs> </compilerarguments> </figuration> </tugin> <glugin> <proupid> org.apache.maven.plugins </groupid> <artifactid> maven-war-plugin </artifactid> <versión> 2.3 </versión> <figuration> <alconmissingwebxml> false </failonmissingwebxml> </figurati on> </tugin> <tugin> <grupid> org.apache.
Al mismo tiempo, para usar Glassfish 4, se deben agregar los siguientes complementos:
Plugin> <MoupRoD> org.glassfish.embedded </groupid> <artifactid> maven-embebido-glassfish-plugin </artifactid> <versión> 4.0 </versions> <confi guration> <OTOTPREFIX> Embeded-GlassSfish </oPRefix> <App> $ {Basedir}/Target/$ {Project.ArtifactId}-$ {Project.Version} .War </App> <Stodelete> True </autodelete> <port> 8080 </port> <name> $ { Project .ArtifactId} </name> <tetextroot> Hascode </tetextroot> </figuration> <ecucesions> <secution> <estions> <SOTS> implementando </meta> </metas> </exe cution> </ecucesions> </tugin>
Configuración del punto final del WebSocket
Primero veamos el código del Servidor WebSocket de la siguiente manera, y luego realicemos un análisis adicional:
paquete com.hascoso.tutorial; WebSocket .onopen; decoders = chatMessageCoder.Class) Public Class ChatEndpoint {Logger final privado log = logger.getLogger (getClass (). getName ()); {Log. String Room = (String) Session.GetUserProperties (). Get ("Room"); ) .get ("sala")) {s.getBasicRemote (). SendObject (chatMessage); }}
El siguiente analiza el código anterior:
Use @ServerEndpoint para definir un nuevo punto final, donde el valor especifica la URL y puede usar el parámetro PathParams, al igual que se usa en JAX-RS.
Por lo tanto, el valor "/chat/{habitación}" permite al usuario conectarse a una sala de chat a través de la siguiente url: ws: //0.0.0.0: 8080/hascode/chat/java
El valor en los aparatos ortopédicos (es decir, la habitación) se puede inyectar como un parámetro en el método de devolución de llamada del ciclo de vida del punto final utilizando javax.websocket.server.pathparam.
Además, queremos usar una clase codificada y decodificada porque estamos utilizando una clase DTO que se usa para transferir datos en el lado del servidor y el cliente.
Cuando el usuario se conecta al servidor por primera vez y ingresa al número de habitación para ingresar a la sala de chat, el número de habitación se inyectará en el envío en forma de parámetros, y el valor se guarda en el mapa de propiedades del usuario utilizando la sesión. getUserProperties.
Cuando un participante del chat envía información al servidor a través de la conexión TCP, se dispara a través de todas las sesiones abiertas, cada sesión está vinculada a la sala de chat especificada y recibe información codificada y decodificada.
Si queremos enviar información o información de texto simple en formato binario, podemos usar session.getBasicRemote (). SendBinary () o session.getBasicRemote (). SendText ()
A continuación, veamos el código utilizado para representar la entidad de transferencia de información (DTO: objeto de transferencia de datos), como sigue:
paquete com.hascode.tutorial;
Conversión de mensajes de chat
En esta aplicación, se escribirá una clase de codificación y decodificación para convertir entre información de chat y formato JSON.
Primero veamos la implementación de la clase de decodificación, que convertirá la información de chat pasada al servidor a la clase de entidad de chatmessage. Aquí, la especificación de la API Java para el procesamiento JSON (JSR353) se utiliza para convertir la información del formato JSON en clases de entidad.
Paquete com.hascoso.tutorial; import javax.websocket.endpointConfig; ChatMessageCoder implementa decoder.text <atmessage> {@Override public void init (configuración final de punto final) {} @Override public void destruye () {} @Override CHATMESSAGE DECODE (Final String TextMessage) lanza decodexception {chatMessage chatmessage = new ChatMessage (); getString ("remitente");
Veamos el código de la clase de codificación.
paquete com.hascoso.tutorial; void init (final de la configuración final de punto final) {} @Override public void destruye () {} @Override public String code (final chatMessage chatMessage) lanza el enexception {return json.createObjectBuilder () .Add ("Mensaje", chatmessage.getMessage () () ).
Aquí puede ver el poderoso poder de JSR-353.
Construya un cliente simple a través de Bootstrap y Javacsript
Finalmente, usamos de manera integral el famoso Bootstrap, JQuery Framework y JavaScript para diseñar un cliente simple. Creamos un nuevo archivo index.html en el directorio src/main/weApp, y el código es el siguiente:
* Var $ Mensaje; no .message + '</td> </tr>'); "," remitente ":" ' + $ nickname.val () +' "," recibido ":" "} '; wsocket.send (msg); $ message.val (' '). focus ();} function ConnectToChatserver () {Room = $ ('#Opción de sala de chat: seleccionado'). Val (); $ chatwindow.empty (); function () {$ Nickname = $ ('#Nickname'); ; $ Nickname.focus (); + $ Nickname.val () + "@" + Room); }); ) :::::::::::::::::::::: para :::::::::::::::::::::::::::::: :::::::::::::::::: para::: ::::::::::::::::::::::::::::::: :::::::::::::::::::::::::: no Formulario> <h2> Chat SIGN EN </h2> <etiqueta for = "Nickname"> Nickname </label> <input type = "text" placeHolder = "Nickname" id = "Nickname"> <div> <label for = = "Chatroom"> Chatroom </ etiqueta> <select size = "1" id = "sala de chat"> <opción> arduino </: :::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::: :: :::::::::::::::::: para::: ::::::::::::::::::::::::::::::: :::::::::::::::::: para::: ::::::::::::::::::::::::::::::: :: ::: opción> <pection> java </ppection> <pection> groovy </opción> <pection> scala </option> </select> </div> <button type = "enviar" id = "Enterroom "> Iniciar sesión </boton> </form> </div> <!-/Container-> <div> <form de formato =" do-chat "> <h2> </h2> <table id =" Respuesta "> </table> <fieldset> <legend> Ingrese su mensaje .. </legend> <div> <input type =" text "placeHolder =" su mensaje ... "id =" mensaje "style =" altura de altura : 60px "/> <input type =" subt "value =" Enviar mensaje "/> <botón type =" botón "id =" salar-room "> dejar espacio </botón> </div> </sfieldset> < /form> </div> </body> </html>
En el código anterior, preste atención a los siguientes puntos:
Si desea llamar a WebSocket en el lado de JavaScript, debe iniciar la conexión de la siguiente manera: ws: // ip: puerto/context_path/endpoint_url eg ws: //0.0.0.0: 8080/hascode/chat/java
El método para crear una conexión WebSocket es muy simple, utilizando var wsocket = new WebSocket ('ws: //0.0.0.0: 8080/Hascode/chat/java');
Para obtener la información devuelta del servidor, solo necesita establecer el método correspondiente para obtener la información de retorno en la función de devolución de llamada wsocket.onmessage.
Envíe un mensaje WebSocket al servidor, usando wsocket.send (), donde los mensajes que se pueden enviar pueden ser datos de texto o binarios.
Para cerrar la conexión, se utiliza wsocket.close ().
Finalmente, implementamos el código a través del paquete MVN, el pez-glassfish: Run, y luego podemos ver el efecto de la captura de pantalla al comienzo de este artículo.
Lo anterior es una sala de chat implementada con Javaee7, WebSockets y Glassfish4.