En un proyecto reciente, necesitaba usar las nuevas características de Java Websocket, por lo que lo aprendí y sentí que esta tecnología era bastante divertida. Instantáneamente supe cómo se realizó el servicio al cliente en línea en la página web.
Veamos primero la imagen:
Se realiza la comunicación en tiempo real entre varios clientes.
Veamos el diagrama de estructura del proyecto del código: es muy simple, solo 1 clase y 1 página
Luego mira el código específico
Mira primero el código de backend
paquete com.main; import java.io.ioexception; import java.util.concurrent.CopyOnwriteArraySet; import javax.websocket.*; import javax.websocket.server.serverendpoint;/*** @serverendpoint La anotación es una anotación de nivel de clase. Su función es principalmente para definir la clase actual como un lado del servidor WebSocket. * El valor de anotación se utilizará para escuchar la conexión del usuario con la dirección de URL de acceso terminal. El cliente puede conectarse al lado del servidor WebSocket a través de esta URL*/@ServerEndpoint ("/WebSocket") Public Class H5ServletServerSocketsocket {// Variables estáticas utilizadas para registrar el número actual de conexiones en línea. Debe estar diseñado para ser seguro de hilo. privado estático int onlinecount = 0; // El conjunto de hilo seguro del paquete concurrente se utiliza para almacenar el objeto MyWebSocket correspondiente de cada cliente. Para darse cuenta de que el servidor se comunica con un solo cliente, puede usar el mapa para almacenarlo, donde la clave puede identificar al usuario el usuario static staticonwriteArrayset <h5ServletServerSocket> WebSocketSet = new CopyOnWriteArySet <H5ServletServerSocket de vidas> (); // Una sesión de conexión con cierto cliente necesita enviar datos a la sesión de sesión privada del cliente; /** * Método para llamar con éxito al establecimiento de conexión * * @param Session * Parámetros opcionales. Session es una sesión de conexión con un cliente, y necesita enviar datos al cliente a través de él*/ @Onopen public void Onopen (sesión de sesión) {this.session = session; WebSocketSet.add (esto); // addonlinecount () en SET; // Agregar 1 número de número en línea System.out.println ("¡Hay una nueva conexión para unirse! El número actual de personas en línea es" + getOnlineCount ()); } / *** Método para conectar las llamadas de cierre* / @Onclose public void onClose () {WebSocketSet.remove (this); // eliminar subonlinecount () del set; // Eliminar Subonlinecount () de Set; // Eliminar el número en línea por 1 número en línea System.out.println ("¡Hay una conexión cerrada! El número actual de personas en línea es" + getOnlinecount ()); } / *** Método llamado después de recibir el mensaje del cliente*** @param Mensaje* Mensaje enviado por el cliente* @param Session* Parámetros opcionales* / @onMessage public void onMessage (mensaje de cadena, sesión de sesión) {System.Println ("Mensaje del cliente:" + Mensaje); // Mensaje masivo para (H5ServletServerSocket Elem: WebSocketSet) {try {item.sendMessage (mensaje); } catch (ioException e) {E.PrintStackTrace (); continuar; }}}} / ** * llamado cuando ocurre un error * * @param session * @param error * / @onerror public void onError (sesión de sesión, error de lanzamiento) {System.out.println ("Error ocurrió"); Error.printStackTrace (); } /*** Este método es diferente de los métodos anteriores. No hay anotación, es un método agregado de acuerdo con sus necesidades. * * @param mensaje * @throws ioexception */ public void sendMessage (mensaje de cadena) lanza ioexception {this.session.getBasicRemote (). SendText (mensaje); // this.session.getAsyncremote (). SendText (mensaje); } public static sincronizado int getOnlinecount () {return onLineCount; } public static sincronizado void addonLineCount () {H5ServletServerSocket.onlinecount ++; } public static sincronizado void subonlinecount () {h5servletserversocket.onlinecount--; }}El siguiente es el código de página front-end:
<%@ página lenguaje = "java" import = "java.util.*" pageEncoding = "utf-8"%> <%string path = requit.getContextPath (); String basePath = request.getScheme () + ": //" + request.getServerName () + ":" + request.getServerPort () + path + "/";%> <! DocType html> <html> <Head> <Base Href = "<%= Basepath%>"> <1t Título> My Websocket <//Title> </body <body> Whedle id = "mensaje" style = "color: azul"> 【estado】 </div> <br/> Nickname <input id = "username" type = "text" requerido = "requerido"/> <br> content <input id = "text" type = "text"/> <br/> <button onclick = "send ()"> Enviar </botón <botón ondcLick = "Closewebsocket () type = "text/javaScript"> var webSocket = null; // juzga si el navegador actual admite WebSocket if ('WebSocket' en Window) {WebSocket = new WebSocket ("ws: //10.1.1.106: 8080/Socket/WebSocket"); } else {alert ('WebSocket no es compatible!')} // Método de devolución de llamada para errores en conexión WebSocket.Onerror = function () {setMessageInnerHtml ("Error"); }; // Método de devolución de llamada para una conexión exitosa WebSocket.Onopen = function (Event) {setMessageInnerHtml ("Habitación de sala de chat habilitada"); } // Método de devolución de llamada para recibir mensajes websocket.onmessage = function () {setMessageInnerHtml (event.data); } // Conexión del método de devolución de llamada cerrada WebSocket.Onclose = function () {setMessageInnerHtml ("Chat Room Close"); } // Escuche el evento de cierre de la ventana. Cuando la ventana esté cerrada, cierre activamente la conexión WebSocket para evitar que la ventana se cierre antes de que la conexión esté desconectada, y el lado del servidor arrojará excepciones. window.onbeforeNeMload = function () {webSocket.close (); } // Mostrar el mensaje en la función de la página web setMessageInnerHtml (innerhtml) {document.getElementById ('Mensaje'). InnerHtml + = InnerHtml + '<br/>'; } // cerrar la función de conexión CloseWebSocket () {WebSocket.close (); } // Enviar la función de mensaje send () {var userName = document.getElementById ('username'). Valor; var mension = document.getElementById ('Text'). Valor; var msg = "【" + nombre de usuario + "] hablar:" + mensaje websock.send (msg); } </script> </html>Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.