Ayer utilicé HTML5 websocket y Tomcat para implementar el chat entre varias personas. Es lo más simple y básico a lo que hay que prestar atención: el entorno de desarrollo debe cumplir con jdk1.7 y tomcat8. ¡También funcionará!
¡Hoy es el último día del Día Nacional, así que tengo que trabajar horas extras y seguir codificando! Afortunadamente, utilicé Google para encontrar chats entre pares sobre websocket. Lo que es aún mejor es que puede funcionar bien con la mayoría de los sistemas. Eche un vistazo a las representaciones.
Debido a que es una simulación, lo que se proporciona aquí son dos páginas JSP A y B, que colocan dos nombres Xiaoming y Xiaohua en la sesión respectivamente. Tenga en cuenta que la sesión aquí es la sesión HttpSession y la sesión en el chat de varias personas anterior es javax. .websocket.Session; es diferente.
Piénselo aquí, use la sesión HttpSession para controlar a los usuarios del chat, adivine cuáles son los beneficios ~~~
Aquí no se utilizan anotaciones. En el método de configuración tradicional web.xml, el método InitServlet se llama por primera vez cuando se inicia el sistema.
la clase pública InitServlet extiende HttpServlet {privado estático final largo serialVersionUID = -3163557381361759907L; privado estático HashMap<String,MessageInbound> socketList; public void init(ServletConfig config) lanza ServletException { InitServlet.socketList = new HashMap<String,MessageInbound>(); super.init(config); System.out.println(inicializar contenedor de chat); } HashMap estático público<String,MessageInbound> getSocketList() { return InitServlet.socketList;Aquí puedes combinarlo con tu propio sistema. El código de configuración web correspondiente es el siguiente:
<?xml versión=1.0 codificación=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> <servlet-name>websocket</servlet-name> <servlet-class>socket.MyWebSocketServlet</servlet-class > </servlet> <servlet-mapping> <servlet-name>websocket</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <servlet> <servlet-name>initServlet</servlet-name> <servlet-class>socket.InitServlet</servlet-class> <load-on-startup>1</load-on-startup ><!--Nivel de ejecución del método--> </servlet> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </lista-de-archivos-de-bienvenida></web-app>
Este es el proceso más común para que la recepción envíe solicitudes en segundo plano y también es fácil de integrar en su propio sistema.
MiWebSocketServlet:
clase pública MyWebSocketServlet extiende WebSocketServlet { public String getUser(HttpServletRequest request){ String userName = (String) request.getSession().getAttribute(user); if(userName==null){ return null } return userName } protected StreamInbound createWebSocketInbound; (Cadena arg0, solicitud HttpServletRequest) { System.out.println(usuario + request.getSession().getAttribute(usuario) + iniciar sesión nuevo MyMessageInbound(this.getUser(solicitud));MyMessageInbound hereda MessageInbound
socket de paquete;importar java.io.IOException;importar java.nio.ByteBuffer;importar java.nio.CharBuffer;importar java.util.HashMap;importar org.apache.catalina.websocket.MessageInbound;importar org.apache.catalina.websocket .WsOutbound;importar util.MessageUtil;clase pública MyMessageInbound extiende MessageInbound {cadena privada nombre; public MyMessageInbound() { super(); public MyMessageInbound(String nombre) { super(); this.name = nombre } @Override protected void onBinaryMessage(ByteBuffer arg0) lanza IOException { } @Override protected void onTextMessage(CharBuffer) msg) lanza IOException { //El mapa después de procesar el mensaje enviado por el usuario HashMap<String,String> messageMap = MessageUtil.getMessage(msg); //Procesando clase de mensaje //Mapa de clase de colección de usuarios en línea HashMap<String, MessageInbound> userMsgMap = InitServlet.getSocketList(); String fromName = messageMap.get(fromName); userId de la persona String toName = messageMap.get(toName); //El userId de la persona a quien se envía el mensaje //Obtener el MessageInbound del usuario messageInbound = userMsgMap.get(toName); //Obtener el MessageInbound enviado a la persona en el almacén MessageInbound messageFromInbound = userMsgMap.get(fromName); if(messageInbound!=null && messageFromInbound!=null){ //Si el remitente existe, realizar la operación WsOutbound saliente = messageInbound.getWsOutbound(); messageFromInbound.getWsOutbound(); String content = messageMap.get(content); //Obtener el contenido del mensaje String msgContentString = fromName + say: + content //Construir el mensaje a enviar //Enviar el contenido CharBuffer aMsg = CharBuffer; wrap(msgContentString .toCharArray()); CharBuffer deMsg = CharBuffer.wrap(msgContentString.toCharArray()); outFromBound.writeTextMessage(fromMsg); outbound.writeTextMessage(toMsg); // outFromBound.flush(); outbound.flush() } } @Override protected void onClose(int status) { InitServlet.getSocketList().remove(this) ; super.onClose(status); } @Override protected void onOpen(WsOutbound) { super.onOpen(outbound); //El usuario que inició sesión está registrado if(name!=null){ InitServlet.getSocketList().put(name, this);//ID de servicio al cliente y usuario de almacenamiento} } @Override public int getReadTimeout() {retorno 0;Procese la información enviada por el primer plano en onTextMessage y encapsule la información al destino.
También hay un mensaje útil.
paquete util;importar java.nio.CharBuffer;importar java.util.HashMap;public class MessageUtil { public static HashMap<String,String> getMessage(CharBuffer msg) { HashMap<String,String> map = nuevo HashMap<String,String> (); Cadena msgString = msg.toString(); Cadena m[] = msgString.split(,); map.put(fromName, m[0]); map.put(toName, m[1]);Por supuesto, la recepción también debe transmitir la información en el formato prescrito.
<%@ idioma de la página=java contentType=text/html charset=UTF-8 pageEncoding=UTF-8%><!DOCTYPE html><html><head><meta http-equiv=Content-Type content=text/html; ; conjunto de caracteres=UTF-8><título>Índice</título><tipo de script=texto/javascript src=js/jquery-1.7.2.min.js></script><%session.setAttribute(usuario, minimizar);%><script type=text/javascript>var ws = null;función startWebSocket() { si ('WebSocket' en la ventana) ws = new WebSocket(ws://localhost:8080/WebSocketUser/websocket.do else if); ('MozWebSocket' en la ventana) ws = new MozWebSocket(ws://localhost:8080/WebSocketUser/websocket.do); else alert(no es compatible); ); console.log(evt); // $(#xiaoxi).val(evt.data); setMessageInnerHTML(evt.data); }; función setMessageInnerHTML(innerHTML){ document.getElementById('message').innerHTML += internalHTML + '<br/>'; ws.onclose = function(evt) { //alert(close); 'denglu').innerHTML=fuera de línea }; ws.onopen = function(evt) { //alert(open); document.getElementById('denglu').innerHTML=en línea; document.getElementById('userName').innerHTML='xiaohua'; };}function sendMsg() { var fromName = xiaoxing; ').value; //A quién enviar var content = document.getElementById('writeMsg').value; //Enviar contenido ws.send(fromName+,+toName+,+content);//Presta atención al formato}</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:red;>Iniciando sesión</span><br>Persona de inicio de sesión: <span id=userName></span><br><br><br>A quién : <tipo de entrada=texto id=name value=小明></input><br>Enviar contenido: <input type=text id=writeMsg></input><br>Cuadro de chat: <div id=message style=height: 250px;width: 280px ;borde: 1px sólido; desbordamiento: automático;></div><br><tipo de entrada=valor del botón=enviar onclick=enviarMsg()></input></body></html>Esta es la página A.jsp, B es la misma que la anterior.
A través del código anterior, se puede implementar una función de chat punto a punto, si es a gran escala, se puede convertir en una versión web del sistema de chat, que incluye salas de chat y chats de una sola persona. websocket no admite la transmisión binaria, pero vi a un gran Liu decir algo como esto
Pero ahora siento que usar binario no tiene mucho sentido. He estado confundido durante mucho tiempo. Se dijo que JS no es compatible con binario. Descubrí que en realidad son solo un grupo de estafadores que no han estudiado esto. . (Usando lector de archivos)
Lo anterior es el contenido completo de este artículo. Espero que sea útil para el estudio de todos. También espero que todos apoyen VeVb Wulin Network.