Hier, j'ai utilisé HTML5 websocket et Tomcat pour implémenter le chat à plusieurs. C'est la chose la plus importante à laquelle il faut prêter attention, qui doit être conforme à jdk1.7 et tomcat8. fonctionnera aussi !
Aujourd'hui c'est le dernier jour de la fête nationale, je dois donc faire des heures supplémentaires et continuer à coder ! Heureusement, j'ai utilisé Google pour trouver des discussions peer-to-peer sur Websocket. Ce qui est encore mieux, c'est que cela peut bien fonctionner avec la plupart des systèmes. Jetez un œil aux rendus.
Parce qu'il est simulé, ce qui est donné ici sont deux pages JSP A et B, qui mettent respectivement deux noms Xiaoming et Xiaohua dans la session. Notez que la session ici est une session HttpSession et que la session de la discussion multi-personnes précédente est javax. .websocket.Session; est différent.
Pensez-y ici, utilisez la session HttpSession pour contrôler les utilisateurs du chat, devinez quels sont les avantages ~~~
Les annotations ne sont pas utilisées ici. Dans la méthode de configuration traditionnelle web.xml, la méthode InitServlet est appelée pour la première fois au démarrage du système.
public class InitServlet extends HttpServlet { private static final long serialVersionUID = -3163557381361759907L; super.init(config); System.out.println(initialiser le conteneur de discussion); } public static HashMap<String,MessageInbound> getSocketList() { return InitServlet.socketList;
Ici, vous pouvez le combiner avec votre propre système. Le code de configuration Web correspondant est le suivant :
<?xml version=1.0 encoding=UTF-8?><version web-app=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 ><!--Niveau d'exécution de la méthode--> </servlet> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list></web-app>
Il s’agit du processus le plus courant permettant à la réception d’envoyer des demandes en arrière-plan, et il est également facile à intégrer dans votre propre système.
MonWebSocketServlet :
public class MyWebSocketServlet extends WebSocketServlet { public String getUser(HttpServletRequest request){ String userName = (String) request.getSession().getAttribute(user); if(userName==null){ return null } return userName } protected StreamInbound createWebSocketInbound ; (Chaîne arg0, requête HttpServletRequest) { System.out.println(user + request.getSession().getAttribute(user) + login); return new MyMessageInbound(this.getUser(request));
MyMessageInbound hérite de MessageInbound
package socket; importer java.io.IOException; importer java.nio.ByteBuffer; importer java.nio.CharBuffer; importer java.util.HashMap; importer org.apache.catalina.websocket.MessageInbound; importer org.apache.catalina.websocket .WsOutbound ; importer util.MessageUtil ; classe publique MyMessageInbound étend MessageInbound { chaîne privée nom; public MyMessageInbound() { super(); } public MyMessageInbound(String name) { super(); this.name = name; } @Override protected void onBinaryMessage(ByteBuffer arg0) lance IOException { } @Override protected void onTextMessage(CharBuffer) msg) lance IOException { //La carte après traitement du message envoyé par l'utilisateur HashMap<String,String> messageMap = MessageUtil.getMessage(msg); //Traitement de la classe de message //Mappage des classes de collecte d'utilisateurs en ligne HashMap<String, MessageInbound> userMsgMap = InitServlet.getSocketList(); String fromName = messageMap.get(fromName); userId de la personne String toName = messageMap.get(toName); //L'ID utilisateur de la personne à qui le message est envoyé //Récupère le MessageInbound de l'utilisateur messageInbound = userMsgMap.get(toName); //Récupère le MessageInbound envoyé à la personne dans l'entrepôt MessageInbound messageFromInbound = userMsgMap.get(fromName); if(messageInbound!=null && messageFromInbound!=null){ //Si l'expéditeur existe, effectuez l'opération WsOutbound outbound = messageInbound.getWsOutbound(); WsOutbound outFromBound = messageFromInbound.getWsOutbound(); String content = messageMap.get(content); //Récupérer le contenu du message String msgContentString = fromName + say: + content; //Construire le message à envoyer //Envoyer le contenu CharBuffer àMsg = CharBuffer. wrap(msgContentString .toCharArray()); CharBuffer fromMsg = CharBuffer.wrap(msgContentString.toCharArray()); outFromBound.writeTextMessage(fromMsg); outbound.writeTextMessage(toMsg); // outFromBound.flush(); } } @Override protected void onClose(int status) { InitServlet.getSocketList().remove(this) ; super.onClose(status); } @Override protected void onOpen(WsOutbound sortant) { super.onOpen(outbound); //L'utilisateur connecté est enregistré if(name!=null){ InitServlet.getSocketList().put(name, this);//ID du service client de stockage et utilisateur} } @Override public int getReadTimeout( ) {retour 0; } }
Traitez les informations envoyées par le premier plan dans onTextMessage et encapsulez les informations dans la cible.
Il y a aussi un messageutil
package util; importer java.nio.CharBuffer; importer java.util.HashMap; classe publique MessageUtil { public static HashMap<String,String> getMessage(CharBuffer msg) { HashMap<String,String> map = new HashMap<String,String> (); String msgString = msg.toString(); String m[] = msgString.split(,); map.put(fromName, m[0]); map.put(toName, m[1]); map.put(content, m[2]);
Bien entendu, la réception doit également transmettre les informations dans le format prescrit.
<%@ 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-1.7.2.min.js></script><%session.setAttribute(user, minimiser);%><script type=text/javascript>var ws = null;function startWebSocket() { if ('WebSocket' dans la fenêtre) ws = new WebSocket(ws://localhost:8080/WebSocketUser/websocket.do else if); ('MozWebSocket' dans la fenêtre) ws = new MozWebSocket(ws://localhost:8080/WebSocketUser/websocket.do); else alert(not support); ws.onmessage = function(evt) { //alert(evt.data); ); console.log(evt); // $(#xiaoxi).val(evt.data); setMessageInnerHTML(evt.data); }; function setMessageInnerHTML(innerHTML){ document.getElementById('message').innerHTML += innerHTML + '<br/>' } ws.onclose = function(evt) { //alert(document.getElementById); 'denglu').innerHTML=hors ligne; }; ws.onopen = function(evt) { //alert(open); document.getElementById('denglu').innerHTML=online; document.getElementById('userName').innerHTML='xiaohua'; };}function sendMsg() { var fromName = xiaoxing; var toName = document.getElementById( 'name ').value; //À qui envoyer var content = document.getElementById('writeMsg').value; //Envoyer du contenu ws.send(fromName+,+toName+,+content);//Faites attention au format></script></head><body onload=startWebSocket();><p>Implémentation de la fonction Chat</ p> Statut de connexion : <span id=denglu style=color:red;>Connexion</span><br>Personne de connexion : <span id=userName></span><br><br><br>À qui : < type d'entrée=texte id=name value=小明></input><br>Envoyer le contenu : <input type=text id=writeMsg></input><br>Boîte de discussion : <div id=message style=height : 250px;width : 280px ;border : 1px solide ; débordement : auto;></div><br><input type=button value=send onclick=sendMsg()></input></body></html>
Ceci est la page A.jsp, B est la même que ci-dessus
Grâce au code ci-dessus, une fonction de chat point à point peut être réalisée si elle est à grande échelle, elle peut être transformée en une version Web du système de chat, y compris les salles de discussion et les discussions entre personnes seules. Websocket ne prend pas en charge la transmission binaire, mais j'ai vu un gros Liu dire quelque chose comme ça
Mais maintenant, je pense que l’utilisation du binaire n’a pas beaucoup de sens. J'ai été confus pendant longtemps. On a dit que JS ne supportait pas le binaire. J'ai découvert qu'il s'agissait en fait d'un groupe d'escrocs qui n'avaient pas étudié cela. . (En utilisant le lecteur de fichiers)
Ce qui précède représente l’intégralité du contenu de cet article. J’espère qu’il sera utile à l’étude de chacun. J’espère également que tout le monde soutiendra le réseau VeVb Wulin.