Établir une connexion bidirectionnelle entre le client et le serveur, ce qui signifie que le client doit uniquement envoyer une demande au serveur et le serveur le traitera. peut en attendant ce temps pour continuer à faire d'autres travaux, l'ensemble du processus est asynchrone. Dans cette série de tutoriels, les utilisateurs seront guidés pour utiliser la nouvelle API JSON d'analyse (JSR-353) dans Java EE 7 dans Container Glassfish 4, et utilisent JQuery et bootstrap en combinaison. Cet article oblige les lecteurs à avoir une certaine connaissance des principes de base de HTML 5 WebSocket.
Rendu
Voyons d'abord les rendus après avoir terminé ce tutoriel, comme indiqué ci-dessous:
Préparation
Nous utilisons JDK 7 et Mavn 3 pour construire la bibliothèque.
<properties> <edorsed.dir> $ {project.build.directory} / endossed </endorsed.dir> <project.build.sourceencoding> utf-8 </project.build.so urceencoding> <dependency> <proupId> javax </proupId> <Ertifactid> javaee-api </retifactid> <version> 7.0 </ version> <ccope> fourni </cope> </dependency> </dencesnces> <uild> < Plugins> <Glugin> <GroupId> org.apache.maven.plugins </prômId> <Artifactid> Maven-Compiler-Plugin </ ArfactId> <DERSE> 3.1 </DERNIFRIGNE> <FIFIGITION> <SOU RCE> 1.7 </ Source > <ible cible> 1.7 </ cible> <compilerarguments> <edersedDirs> $ {endorsed.dir} </norsedDirs> </ compilerarguments> </Fonfiguration> </gingin> <gargin> <proupId> org.apache.maven.plugins </prômId> <Ertifactid> maven-war-plagin </lefactive> <version> 2.3 </ version> <Inconguration> <CailonMissingWebxml> False </ failsonmissingwebxml> </finig configUrati on> </gingin> <plugin> <proupId> org.apache.
Dans le même temps, afin d'utiliser Glassfish 4, les plug-ins suivants doivent être ajoutés:
Plugin> <GroupId> org.glassfish.embedded </rompupid> <ArtifactId> Maven-Embedded-Glassfish-Plugin </ ArfactId> <Dersion> 4.0 </DERNIFRIGMENT> <FORFI GURTION> <COLADEPREFIX> Embedded-Glassfish </puilPrefix> <pp> $ {basasedir} / Target / $ {project.artifactid} - $ {project.version} .war </pp> <todelete> true </ autodelete> <port> 8080 </port> <name> $ {{ Project .artifActid} </name> <ContexTroot> Hascode </condexTroot> </FIGIGRUGE> <IMECTRITIONS> <EXÉCUTION> <CORFACT> <FORME> Deploy </ but> </ buts> </ exe CUtion> </Effectitions> </ plugin>
Configuration du point final du WebSocket
Examinons d'abord le code du serveur WebSocket comme suit, puis effectuons une analyse plus approfondie:
package com.hascide.tUtorial; WebSocket .onoPen; Decoders = ChatMessageDecoder.class) Classe publique ChautendPoint {private final logger Log = Logger.getLogger (getClass (). getName ()); {Log. String Room = (String) Session.getUserProperties (). Get ("Room"); ) .get ("Room")) {s.getBasicRemote (). SendObject (ChatMessage);}}} Catch (ioException | EncodeException e) {log.log (niveau.warning, "OnMessage a échoué", e); }}
Le suivant analyse le code ci-dessus:
Utilisez @ServeRendPoint pour définir un nouveau point de terminaison, où la valeur spécifie l'URL et peut utiliser le paramètre PathParams, tout comme il est utilisé dans Jax-RS.
Par conséquent, la valeur "/ chat / {room}" permet à l'utilisateur de se connecter à une salle de chat via l'URL suivante: ws: //0.0.0.0: 8080 / hascode / chat / java
La valeur en accolades (c'est-à-dire la pièce) peut être injectée en tant que paramètre dans la méthode de rappel du cycle de vie du point de terminaison en utilisant javax.websocket.server.pathparam.
De plus, nous voulons utiliser une classe codée et décodée car nous utilisons une classe DTO qui est utilisée pour transférer des données du côté serveur et client.
Lorsque l'utilisateur se connecte au serveur pour la première fois et entre dans le numéro de pièce pour entrer dans la salle de chat, le numéro de la salle sera injecté dans la soumission sous forme de paramètres, et la valeur est enregistrée dans la carte de la propriété de l'utilisateur à l'aide de la session. getUserProperties.
Lorsqu'un participant au chat envoie des informations au serveur via la connexion TCP, il parcourt toutes les sessions ouvertes, chaque session est liée à la salle de chat spécifiée et reçoit des informations encodées et décodées.
Si nous souhaitons envoyer des informations textuelles simples ou des informations au format binaire, nous pouvons utiliser session.getBasicRemote (). SendBinary () ou session.getBasicRemote (). SendText ()
Ensuite, examinons le code utilisé pour représenter l'entité de transfert d'informations (DTO: objet de transfert de données), comme suit:
package com.hasccode.Tutorial;
Conversion des messages de chat
Dans cette application, une classe d'encodage et de décodage sera écrite pour convertir entre les informations de chat et le format JSON.
Examinons d'abord la mise en œuvre de la classe de décodage, qui convertira les informations de chat transmises au serveur en classe d'entité ChatMessage. Ici, la spécification Java pour le traitement JSON (JSR353) est utilisée pour convertir les informations de format JSON en classes d'entités.
package com.hascide.tUtorial; Importer javax.websocket.endPointConfig; la classe publique ChatMessageDecoder implémente Decoder.Text <CatMessage> {@Override public void init (Final Endpoint Config) {} @Override public void destren () {} @Override public ChatMessage Decode (Final String TextMessage) lance DecodeException {ChatMessage ChatMessage = new ChatMessage (); getString ("Sender");
Regardons le code de la classe d'encodage.
package com.hasccode.tutorial; void init (Final EndPointConfig config) {} @Override public void destrement () {} @Override public String Encode (final ChatMessage ChatMessage) lance Enco Deexception {return JSON.CreateObjectBuilder () .Add ("Message", ChatMessage.getMessage () ).
Ici, vous pouvez voir la puissance puissante de JSR-353.
Construisez un client simple via Bootstrap et Javacsript
Enfin, nous utilisons de manière approfondie le célèbre bootstrap, le framework JQuery et JavaScript pour concevoir un client simple. Nous créons un nouveau fichier index.html dans le répertoire SRC / Main / WeApp, et le code est le suivant:
<! Doctype html> <html lang = "en"> <éadfr> [..] <script> var wsocket; Var $; Var $ Chatwindow; )); API natif var $ Messageline = $ ('<tr> <td>' + msg.received + '</td> <td>' + msg.sender + '</td> <td>' + msg .Message + '</ td> </tr>'); $ chatwindow.APPEND ($ Messageline); "," Sender ":" '+ $ nausson.val () +' "," reçu ":" "} '; wsocket.send (msg); $ message.val (' '). focus ();} fonction ConnectoChatServer () {Room = $ ('# Option Chatroom: Select'). Val (); $ chatwindow.empty (); $ (. function () {$ nautiquer = $ ('# nauel'); $ message = $ ('# message'); ; + $ ne surnom. rès ): ::::::::::::::::::::::::::::::::::::- : :::::::::::::::::::::::::::::::::::- :::::::::::::::::::::::::::; Form> <h2> CHAT Connexion dans </h2> <label for = "surname"> Nonom </ Label> <Input Type = "Text" Planholder = "Nelname" id = "surname"> <div> <label for = "Chatroom"> Chatroom </ Label> <Select size = "1" id = "Chatroom"> <option> arduino </ :::::::::::::::::::::::::: : :::::::::::::::::::::::::::::::::::- : :::::::::::::::::::::::::::::::::::- : ::::: option> <opoption> java </ option> <option> groovy </ option> <opopoption> scala </ option> </lect> </div> <bouton type = "soumi" id = "enterroom "> Connectez-vous </futton> </ form> </div> <! - / conteneur -> <div> <form id =" do-chat "> <h2> </h2> <table id =" Réponse "> </ table : 60px "/> <input type =" soumi "value =" Envoyer un message "/> <bouton type =" Button "id =" lave-room "> LETTH RACK </ Button> </div> </fieldset> < / form> </div> </ body> </html>
Dans le code ci-dessus, veuillez prêter attention aux points suivants:
Si vous souhaitez appeler WebSocket du côté JavaScript, vous devez lancer la connexion de la manière suivante: ws: // ip: port / context_path / endpoint_url eg ws: //0.0.0.0: 8080 / hascode / chat / java / java
La méthode de création d'une connexion WebSocket est très simple, en utilisant var wsocket = new WebSocket ('ws: //0.0.0.0: 8080 / hascode / chat / java');
Pour obtenir les informations renvoyées du serveur, il vous suffit de définir la méthode correspondante pour obtenir les informations de retour dans la fonction de rappel wsocket.onMessage.
Envoyez un message WebSocket au serveur, en utilisant wsocket.send (), où les messages qui peuvent être envoyés peuvent être des données SMS ou binaires.
Pour fermer la connexion, wsocket.close () est utilisé.
Enfin, nous déployons le code via le package MVN embarqué.
Ce qui précède est une salle de discussion mise en œuvre à l'aide de Javaee7, Websockets et Glassfish4.