Tout d'abord, je voudrais vous déclarer: JDK 7 est requis, Tomcat doit prendre en charge la version WebSocket
1.InitServlet
Cette classe est principalement utilisée pour initialiser le référentiel de carte qui construit le stockage futur des informations d'identité utilisateur, utilisez sa méthode d'initialisation init pour initialiser le référentiel et utiliser sa méthode statique GetSocket pour obtenir les informations d'identité utilisateur correspondantes.
WebSocket, je pense que MessageInbound est utilisé pour identifier les informations de la connexion, l'utiliser pour trouver la personne correspondante et pousser les messages. Chaque connexion générera un message.
Ici HashMap <String, MessageInbound>: String stocke l'ID de connexion de la session utilisateur et MessageInbound stocke les informations d'identité requises pour pousser. Ce qui précède est une compréhension orale personnelle.
prise de colis; import java.nio.charbuffer; import java.util.arraylist; import java.util.hashmap; Importer java.util.list; Importer javax.servlet.servletConfig; Importer javax.servlet.servletException; import javax.servlet.http.httpservlet; import org.apache.catalina.websocket.MessageInbound; La classe publique Initservlet étend httpServlet {private static final long SerialVersionUID = -l; // Liste statique privée <MessageInbound> SocketList; STATIQUE STATIQUE PRIVÉ <String, MessageInbound> SocketList; public void init (ServletConfig config) lève Servlexception {// initservlet.socketList = new ArrayList <MessageInbound> (); Initservlet.socketList = new HashMap <String, MessageInbound> (); super.init (config); System.out.println ("Server start ============"); } public static hashmap <string, MessageInbound> getSocket () {return initservlet.socketlist; } / * public static list <MessageInbound> getSocketList () {return initservlet.socketlist; } * /} 2.Mywebsocketservlet
Le WebSocket est utilisé pour établir un servlet de connexion. Lors de l'établissement d'une connexion, obtenez d'abord l'utilisateur de la connexion en session et passez à l'utilisateur UserID lorsque vous appelez le constructeur MyMessageInbound.
prise de colis; Importer java.io.ioException; import java.io.printwriter; import java.nio.charbuffer; Importer javax.servlet.servletException; import javax.servlet.http.httpservlet; Importer javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletResponse; import org.apache.catalina.websocket.streaminbound; import org.apache.catalina.websocket.websocketservlet; / ** * * @classname: mywebsocketservlet * @Description: créé lors de l'établissement d'une connexion * @Author Mangues * @Date - * / public class MyWebsockETervlet étend WebSocketServlet {public String GetUser (httpServleTrequest demande) {STRING USERNAME = (String) request.getSession (). GetAtTraut if (username == null) {return null; } return nom d'utilisateur; // return (String) request.getAttribute ("utilisateur"); } @Override Protected streamInbound CreateWeBSocketInbound (String arg, httpServLetRequest request) {System.out.println ("#############"); retourner new MyMessageInbound (this.getUser (demande)); }} 3. La méthode ONOpen appelle le référentiel d'identité MAP de l'INITServlet.
Mettez l'utilisateur utilisateur IDID et les informations d'identité WebSocket correspondant à l'utilisateur connecté MessageInBound (UserId peut être utilisé pour trouver l'identité requise pour pousser MessageInbound)
onTextMessage: utilisé pour obtenir des messages et envoyer des messages
prise de colis; Importer java.io.ioException; import java.nio.bytebuffer; import java.nio.charbuffer; import java.util.hashmap; import org.apache.catalina.websocket.MessageInbound; import org.apache.catalina.websocket.wsoutbound; importer util.MessageUtil; La classe publique MyMessageInbound étend MessageInbound {Nom de chaîne privée; public myMessageInbound () {super (); } public myMessageInbound (nom de chaîne) {super (); this.name = name; } @Override Protected void OnbinaryMessage (ByteBuffer Arg) lève IOException {// TODO Méthode générée automatiquement Stub} @Override Protected void OnTextMessage (Charbuffer MSG) lance IoException {// map après le message envoyé par l'utilisateur hashmap <String, String> MessageMap = MessageUtil.getMessage (MSG); // Traitement des messages Classe // Classe de collecte d'utilisateurs Upline Classe HashMap <String, MessageInbound> USERMSGMAP = INITServlet.getSocketList (); String fromName = MessageMap.get ("FromName"); // Le message provient de la chaîne userId toname = MessageMap.get ("toname"); // Le message est envoyé à l'utilisateur de l'utilisateur // obtient le MessageInbound de l'utilisateur = userMsgmap.get (toname); // Le message de message envoyé à l'utilisateur dans l'entrepôt if (MessageInbound! = Null) {// Si le message existe à l'utilisateur, effectuez l'opération wsoutbound Outbound = MessageInbound.getWsoutBound (); String Content = MessageMap.get ("Content"); // Obtenez du message du contenu String msgContentString = FromName + "" + Content; // Construisez le message envoyé // Envoi du contenu Charbuffer tomsg = Charbuffer.Wrap (msgContentString.toCharArray ()); Outbound.WriteTextMessage (Tomsg); // Outbound.flush (); } / * for (messageInBound MessageInbound: initservlet.getsocketList ()) {Charbuffer tamper = Charbuffer.Wrap (msg); WsOutBound Outbound = MessageInbound.getWsoutBound (); outbound.writeTextMessage (tampon); Outbound.flush (); } * /} @Override Protected void onClose (int status) {initservlet.getSocketList (). Suppter (this); super.Onclose (statut); } @Override Protected void onopen (WSOutBound Outbound) {super.onOpen (Outbound); // Locked dans if (name! = Null) {initservlet.getSocketList (). Put (name, this); } // initservlet.getSocketList (). Add (this); }} 4. Classe de traitement des messages, Messages de traitement envoyés par le frontal
package util; import java.nio.charbuffer; import java.util.hashmap; / ** * * @className: MessageUtil * @Description: Message Processing Class * @Author Mangues * @Date - * / public class MessageUtil {public static hashmap <string, string> getMessage (Charbuffer msg) {hashmap <string, string> map = new Hashmap <String, String> (); String m [] = msgstring.split (","); map.put ("FromName", m []); map.put ("toname", m []); map.put ("contenu", m []); carte de retour; }} 5. Configuration Web
<? xml version = "1.0" encoding = "utf-8"?> <web-app version = "3.0" xmlns = "http://java.sun.com/xml/ns/javaee" xmlns: xsi = "http://www.w3.org/2001/xmlschema-ristance" XSI: ScheMalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <s servlet> <Servlet-Name> Mywebsocket </vlet-Name> <servlet-class> socket.mywebsocketservlet </ servlet-class> </ servlet> <servlet-mapping> <servlet-name> mywebsocket </ servlet-name> <url-potern> *. do </url-platern> </vrlett-mapping> <sterlet> <Servlet-name> initservlet </vlet-name> <Servlet-Class> Socket.InitServlet </ Servlet-Class> <Choad-on-Startup> 1 </ Load-on-Startup> </Servlet> <Welcome-File-List> <Deen welcome> index.jsp </ bienvenue-file> </ bienvenue-file-list> </ web -pp>
6. Front-end, pour plus de commodité, j'ai directement utilisé deux JSP, et utilisé <% session.setAttribute ("utilisateur", "xiaoMing")%> pour indiquer la connexion.
Il n'y a pas de différence essentielle entre les deux JSP, il est simplement utilisé pour indiquer que deux personnes différentes sont connectées. Vous pouvez ouvrir différents JSP dans le même navigateur pour discuter.
A. Minimiser
<% @ page Language = "Java" contentType = "Text / html; charset = utf-" pageencoding = "utf -"%> <! doctype html> <html> <adread> <meta http-equiv = "Content-Type" content = "Text / html; charset = utf -"> <title> index </ title> type = "text / javascript" src = "js / jQuery ... min.js"> </ script> <% session.setAttribute ("utilisateur", "minimiser");%> <script type = "text / javascript"> var ws = null; fonction startwebsocket () {if ('WebSocket' dans la fenêtre) ws = new WebSocket ("ws: // localhost: /websocket/mywebsocket.do"); else if ('mozwebsocket' dans la fenêtre) ws = new Mozwebsocket ("ws: // localhost: /websocket/mywebsocket.do"); else alert ("pas support"); ws.OnMessage = function (evt) {//alert(evt.data); Console.log (EVT); $ ("# xiaoxi"). Val (evt.data); }; ws.Onclose = function (evt) {// alert ("close"); document.getElementById ('Denglu'). innerHtml = "Offline"; }; ws.onopen = function (evt) {// alert ("open"); document.getElementById ('Denglu'). innerHtml = "en ligne"; document.getElementById («nom d'utilisateur»). innerHtml = «minimiser»; }; } fonction sendmsg () {var fromName = "minimiser"; var toname = document.getElementByid ('name'). valeur; // Envoyer à qui var contenu = document.getElementById ('writeMsg'). Valeur; // Envoyer le contenu ws.Send (FromName + "," + Toname + "," + Content); } </ script> </ head> <body onload = "startwebsocket ();"> <p> Fonction de chat Implémentation </p> Statut de connexion: <span id = "Denglu" style = "Color: Red;"> Connexion </span> <br> Personne de connexion: <span id = "username"> </span> <br> <br> <br> qui envoyer à: Ming "> </ entrée> <br> Envoi du contenu: <entrée type =" text "id =" writeMsg "> </put> <br> Chat Box: <TextArea Rows =" "Cols =" "ReadOnly ID =" Xiaoxi "> </Textarea> <br> <Input Type =" Button "Value =" Send "OnClick =" Sendmsg () "> </fort> </ body> </ Html> B. Xiao Ming
<% @ page Language = "Java" ContentType = "Text / Html; charSet = UTF-8" Pageencoding = "UTF-8"%> <! DocType HTML> <HTML> <A-HEAD> <META HTTP-EQUIV = "Content-Type" Content = "Text / Html; Charset = UTF-8"> <Title> Index </ Title> Index </ Title> type = "text / javascript" src = "js / jQuery 2.1.1.min.js"> </ script> <% session.setAttribute ("user", "xiao ming");%> <script type = "text / javascript"> var ws = null; function startwebsock WebSocket ("ws: // localhost: 8080 / Websocket / mywebsocket.do"); else if ('mozwebsocket' dans la fenêtre) ws = new Mozwebsocket ("ws: // localhost: 8080 / Websocket / mywebsocket.do"); else alert ("pas support"); ws.OnMessage = function (evt) {console.log (evt); //alert(evt.data); $ ("# xiaoxi"). Val (evt.data); }; ws.Onclose = function (evt) {// alert ("close"); document.getElementById ('Denglu'). innerHtml = "Offline"; }; ws.onopen = function (evt) {// alert ("open"); document.getElementById ('Denglu'). innerHtml = "en ligne"; document.getElementById ('username'). innerhtml = "xiao ming"; };} fonction sendmsg () {var fromName = "xiao ming"; var toname = document.getElementByid ('name'). valeur; // Envoyer à qui var contenu = document.getElementById ('writeMsg'). Valeur; // Envoi du contenu ws.Send (FromName + "," + Toname + "," + Content);} </script> </ head> <body onload = "startwebsocket ();"> <p> la fonction de chat implémentation </p> se connecter à la connexion: <span id = "Denglu" style = "Color: Red;"> Connexion dans </span> <br> id = "username"> </span> <br> <br> <br> Envoyer à: <input type = "text" id = "name" value = "minimiser"> </put> <br> Envoyer du contenu: <input type = "text" id = "writeMsg"> </put> <br> Chat Box: <textArea Rows = "13" Cols = "100" ReadOnly Id = "Xiaoxi "> </ Texa> <bol type = "Button" value = "Send" onClick = "sendmsg ()"> </fort> </body> </html>Ce qui précède est les connaissances pertinentes sur l'utilisation de Javaweb WebSocket pour implémenter un exemple de fonction de fonction de chat de chat pair-to-peer. J'espère que ce sera utile à tout le monde. Si vous avez des questions, veuillez me laisser un message et l'éditeur répondra à tout le monde à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!