En primer lugar, me gustaría declararle: se requiere JDK 7, Tomcat necesita admitir la versión WebSocket
1.initservlet
Esta clase se usa principalmente para inicializar el repositorio de mapas que construye el almacenamiento futuro de la información de identidad del usuario, utiliza su método de inicialización inicial para inicializar el repositorio y utilizar su método estático GetocketList para obtener la información de identidad del usuario correspondiente.
WebSocket, creo que MessageInbound se utiliza para identificar la información del inicio de sesión, usarla para encontrar la persona correspondiente y empujar los mensajes. Cada inicio de sesión generará un mensaje de Message.
Aquí hashmap <String, MessageInbound>: String almacena el ID de inicio de sesión de la sesión del usuario y MessageInbound almacena la información de identidad requerida para presionar. Lo anterior es la comprensión oral personal.
zócalo de paquete; import java.nio.charbuffer; import java.util.arrayList; import java.util.hashmap; import java.util.list; import javax.servlet.servletConfig; import javax.servlet.servletException; import javax.servlet.http.httpservlet; importar org.apache.catalina.websocket.messageInbound; clase pública initservlet extiende httpservlet {private static final long serialversionUid = -l; // Lista estática privada <MessageInbound> SocketList; Hashmap estático privado <String, MessageInbound> SocketList; public void init (ServletConfig config) lanza ServletException {// initservlet.socketList = new ArrayList <MessageInbound> (); Initservlet.socketList = new HashMap <String, MessageInbound> (); super.init (config); System.out.println ("Servidor Start ============"); } public static hashmap <String, MessageInbound> getSocketList () {return initservlet.socketList; } /* Lista estática pública <SessageInbound> getSocketList () {return initservlet.socketList; } */} 2. MywebSocketServlet
El WebSocket se utiliza para establecer un servlet de conexión. Al establecer una conexión, primero obtenga el ID de usuario de la sesión de inicio de sesión y pase el ID de usuario al llamar al constructor MyMessageInbound.
zócalo de paquete; import java.io.ioException; import java.io.printwriter; import java.nio.charbuffer; import javax.servlet.servletException; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletResponse; importar org.apache.catalina.websocket.streaminbound; importar org.apache.catalina.websocket.websocketservlet; / ** * * @classname: myWebSocketServlet * @Description: creado al establecer una conexión * @author mangues * @date - */ public class myWebSocketServlet extiende WebSocketServlet {public String getUser (httpServletRequest request) {String username = (String) request.getSession (). GetAttribute ("User"); if (username == null) {return null; } devolver el nombre de usuario; // return (string) request.getAttribute ("usuario"); } @Override streamInbound createWebSocketInbound (String arg, httpservletRequest solicitud) {system.out.println ("############"); devolver nuevo myMessageInbound (this.getuser (solicitud)); }} 3. El método Onopen llama al repositorio de identidad del mapa del InitServlet.
Coloque el usuario de usuario de usuario y la información de identidad de WebSocket correspondiente al mensaje de usuario registrado (MessageInbound de usuario (UserID se puede usar para encontrar la identidad requerida para presionar MessageInbound)
OnTextMessage: se usa para recibir mensajes y enviar mensajes
zócalo de paquete; import java.io.ioException; import java.nio.bytebuffer; import java.nio.charbuffer; import java.util.hashmap; importar org.apache.catalina.websocket.messageInbound; importar org.apache.catalina.websocket.wsoutBound; import util. MessageUtil; clase pública myMessageInbound extiende MessageInbound {Nombre de cadena privada; public myMessageInbound () {super (); } public myMessageInbound (nombre de cadena) {super (); this.name = name; } @Override protegido void onbinaryMessage (bytebuffer arg) lanza ioexception {// toDO Auto generado método stub} @Override void onTextMessage (charbuffer msg) lanza ioexception {// mapa después del mensaje enviado por el usuario hashmap <string> messageMap = metal. // CLASE DE MENSACIÓN DE PROCESIMIENTO // Mapa de la clase de recopilación de usuarios de línea ascendente Hashmap <String, MessageInbound> UsermSGMap = Initservlet.getSocketList (); Cadena fromName = MessageMap.get ("fromName"); // El mensaje proviene de la cadena de usuario Toname = MessageMap.get ("toname"); // El mensaje se envía al INSEREDID de usuario del usuario // Obtenga UsermesSageInbound MessageInbound = usermsgmap.get (toname); // El mensaje de Message enviado al usuario en el almacén if (MessageInbound! = NULL) {// Si el mensaje existe al usuario, realice Operation WSOUTBound outbound = MessageInbound.getWSoutBound (); String content = MessageMap.get ("contenido"); // Obtener una cadena de contenido de mensaje msgContentString = fromname + "" + content; // Construye el mensaje enviado // Enviar el contenido Charbuffer TomSg = Charbuffer.wrap (msgContentstring.toCarArray ()); Outbound.WriteTextMessage (TomSg); // outbound.flush (); } /* para (MessageInbound MessageInbound: initservlet.getSocketList ()) {charbuffer buffer = charbuffer.wrap (msg); Wsoutbound outbound = messageInbound.getWSoutBound (); ourbound.writeTextMessage (buffer); ourbound.flush (); } */} @Override protegido void onClose (int status) {initservlet.getSocketList (). Eliminar (this); Super.Onglare (estado); } @Override protegido void onopen (wsoutbound outbound) {super.onopen (saliendo); // logine en if (name! = Null) {initservlet.getSocketList (). PUT (Nombre, esto); } // initservlet.getSocketList (). Agregar (this); }} 4. Clase de procesamiento de mensajes, procesamiento de mensajes enviados por el front-end
paquete utilizado; import java.nio.charbuffer; import java.util.hashmap; / ** * * * @classname: MessageUtil * @Description: Clase de procesamiento de mensajes * @Author Mangues * @date - */ public class MessageUtil {public static Hashmap <String, String> getMessage (charbuffer msg) {Hashmap <String, String> MAP = New Hashmap <String, String, String> (); Cadena m [] = msgstring.split (","); map.put ("fromname", m []); map.put ("toname", m []); map.put ("contenido", m []); mapa de retorno; }} 5. Configuración web
<? xml versión = "1.0" encoding = "utf-8"?> <web-app versión = "3.0" xmlns = "http://java.sun.com/xml/ns/javaee" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <servlet> <ervlet-name> mywbsocket </servlet-name> <Servlet-class> Socket.mywebSocketServlet </servlet-class> </servlet> <ervlet-mapping> <ervlet-name> mywebsocket </servlet-name> <url-pattern>*. do </url-pattern> </servlet-mapping> <ervlet> <ervlet-name> initservlet </servlet-name> <ervlet-class> socket. <ar carga-on-startup> 1 </load-on-startup> </servlet> <beating-file-list> <welcome-file> index.jsp </welcome-file> </le bienvenido-file-list> </seb-app>
6. Front-end, por conveniencia, usé directamente dos JSP y usé <%session.SetAttribute ("Usuario", "Xiao Ming")%> para indicar el inicio de sesión.
No hay una diferencia esencial entre los dos JSP, solo se usa para indicar que dos personas diferentes están registradas. Puede abrir diferentes JSP en el mismo navegador para chatear.
A. Minimizar
<%@ page language="java" contentType="text/html; charset=UTF-" pageEncoding="UTF-"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-"> <title>Index</title> <script type = "text/javaScript" src = "js/jQuery ... min.js"> </script> <%session.setAttribute ("usuario", "minimizar");%> <script type = "text/javascript"> var ws = null; function startWebSocket () {if ('WebSocket' en la ventana) ws = new WebSocket ("ws: // localhost: /websocket/mywebsocket.do"); else if ('mozwebsocket' en la ventana) ws = nuevo mozwebsocket ("ws: // localhost: /websocket/mywebsocket.do"); else alerta ("no apoyar"); ws.onmessage = function (evt) {//alert(evt.data); console.log (EVT); $ ("#xiaoxi"). Val (evt.data); }; ws.onclose = function (evt) {// alert ("cerrar"); document.getElementById ('Denglu'). InnerHtml = "fuera de línea"; }; ws.onopen = function (evt) {// alerta ("abrir"); document.getElementById ('Denglu'). Innerhtml = "en línea"; document.getElementById ('username'). innerhtml = 'minimizar'; }; } función sendmsg () {var fromName = "minimizar"; var toname = document.getElementById ('nombre'). Valor; // Enviar a quien var content = document.getElementById ('WriteMSg'). Value; // Enviar contenido ws.send (fromName+","+toname+","+contenido); } </script> </head> <body onload = "startWebSocket ();"> <p> Implementación de la función de chat </p> Estado de inicio de sesión: <span id = "denglu" style = "color: rojo;"> registrar </span> <br> persona de inyección de inyección: <span id = "userNeName"> </span> <br> <BR> <BR> <BR> a quién enviar a: <type de entrada = "ID" nombre "n. Ming "> </put> <br> Enviar contenido: <input type =" text "id =" writemsg "> </put> <br> cuadro de chat: <textarea rows =" "cols =" "readonly id =" xiaoxi "> </textarea> <br> <input type =" button "value =" envía "onclick =" sendmsg () "> </input> </inputing> </body <br> <input type =" button "valor =" enviar "onclick =" sendmsg () "> </input> </input. B. Xiao Ming
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Index</title><script type = "text/javaScript" src = "js/jQuery 2.1.1.min.js"> </script> <%session.setTribute ("user", "xiao ming");%> <script type = "text/javaScript"> var ws = null; function startwebSocket () {if ('websocket' en ventana) ws = nuevo = nuevo = nuevo WebSocket ("ws: // localhost: 8080/websocket/mywebsocket.do"); else if ('mozwebsocket' en la ventana) ws = nuevo mozwebsocket ("ws: // localhost: 8080/webSocket/mywebsocket.do"); else alerta ("no apoyar"); ws.onmessage = function (evt) {console.log (evt); //alert(Evt.Data); $ ("#xiaoxi"). Val (evt.data); }; ws.onclose = function (evt) {// alert ("cerrar"); document.getElementById ('Denglu'). InnerHtml = "fuera de línea"; }; ws.onopen = function (evt) {// alerta ("abrir"); document.getElementById ('Denglu'). Innerhtml = "en línea"; document.getElementById ('UserName'). InnerHtml = "Xiao Ming"; };} función sendmsg () {var fromName = "xiao ming"; var toname = document.getElementById ('nombre'). Valor; // Enviar a quien var content = document.getElementById ('WriteMSg'). Value; //Send content ws.send(fromName+","+toName+","+content);}</script></head><body onload="startWebSocket();"><p>Chat function implementation</p>Log in login status: <span id="denglu" style="color:red;">Log in</span><br>Log in person: <span id = "UserName"> </span> <br> <br> <br> Enviar a: <input type = "text" id = "name" value = "minimizar"> </put> <br> Enviar contenido: <input type = "text" id = "writeMSg"> </put> <br> Box de chat: <TextArea Rows = "13" cols = "100" Readonly id = "xiaoxi"> </textarea> <br> <input type = "button" value = "send" onClick = "sendmsg ()"> </input> </body> </html>Lo anterior es el conocimiento relevante sobre el uso de Javaweb WebSocket para implementar el código de ejemplo simple de la función de chat de igual a igual. Espero que sea útil para todos. Si tiene alguna pregunta, déjame un mensaje y el editor responderá a todos a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!