Gestern habe ich HTML5-Websocket und Tomcat verwendet, um den Multi-Personen-Chat zu implementieren. Das Wichtigste ist, dass die Entwicklungsumgebung jdk1.7 und tomcat8 erfüllt wird auch funktionieren!
Heute ist der letzte Tag des Nationalfeiertags, also muss ich Überstunden machen und weiter programmieren! Glücklicherweise habe ich Google verwendet, um Peer-to-Peer-Chats über WebSocket zu finden. Was noch besser ist, ist, dass es mit den meisten Systemen gut funktioniert.
Da es sich um eine Simulation handelt, werden hier zwei JSP-Seiten A und B angegeben, die jeweils zwei Namen, Xiaoming und Xiaohua, in die Sitzung einfügen. Beachten Sie, dass es sich bei der Sitzung hier um eine HttpSession-Sitzung und bei der Sitzung im vorherigen Mehrpersonen-Chat um Javax handelt .websocket.Session; ist anders.
Denken Sie hier darüber nach, verwenden Sie die HttpSession-Sitzung, um Chat-Benutzer zu steuern, und raten Sie mal, was die Vorteile sind ~~~
Anmerkungen werden hier nicht verwendet. In der herkömmlichen web.xml-Konfigurationsmethode wird die InitServlet-Methode zuerst aufgerufen, wenn das System gestartet wird.
öffentliche Klasse InitServlet erweitert HttpServlet { private static final long serialVersionUID = -3163557381361759907L; private static HashMap<String,MessageInbound> socketList; public void init(ServletConfig config) throws ServletException { InitServlet.socketList = new HashMap<String,MessageInbound>(); super.init(config); System.out.println(initialize chat container); } public static HashMap<String,MessageInbound> getSocketList() { return InitServlet.socketList;
Hier können Sie es mit Ihrem eigenen System kombinieren. Der entsprechende Web-Konfigurationscode lautet wie folgt:
<?xml version=1.0 binding=UTF-8?><web-app version=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 ><!--Methodenausführungsebene--> </servlet> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list></web-app>
Dies ist der gängigste Prozess für die Rezeption, um Anfragen im Hintergrund zu senden, und er lässt sich auch leicht in Ihr eigenes System einbetten.
MyWebSocketServlet:
öffentliche Klasse MyWebSocketServlet erweitert WebSocketServlet { public String getUser(HttpServletRequest request){ String userName = (String) request.getSession().getAttribute(user); if(userName==null){ return null } protected StreamInbound createWebSocketInbound (String arg0, HttpServletRequest-Anfrage) { System.out.println(user + request.getSession().getAttribute(user) + login return new MyMessageInbound(this.getUser(request));
MyMessageInbound erbt MessageInbound
package socket;import 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;import util.MessageUtil;public class MyMessageInbound erweitert MessageInbound { private String name; public MyMessageInbound() { super(); } public MyMessageInbound(String name) { super(); this.name = name } @Override protected void onBinaryMessage(ByteBuffer arg0) throws IOException { } @Override protected void onTextMessage( msg) throws IOException { //Die Karte verarbeitet nach der Verarbeitung der vom Benutzer gesendeten Nachricht HashMap<String,String> messageMap = MessageUtil.getMessage(msg); //Verarbeitung der Nachrichtenklasse //Online-Benutzersammlungsklassenzuordnung HashMap<String, MessageInbound> userMsgMap = InitServlet.getSocketList(); //Die Nachricht kommt von der Benutzer-ID der Person String toName = messageMap.get(toName); //Die Benutzer-ID der Person, an die die Nachricht gesendet wird //MessageInbound des Benutzers abrufen messageInbound = userMsgMap.get(toName); // Den an die Person im Warehouse gesendeten MessageInbound abrufen MessageFromInbound = userMsgMap.get(fromName); if(messageInbound!=null && messageFromInbound!=null){ //Wenn der Absender existiert, führen Sie ihn aus die Operation WsOutbound outbound = messageInbound.getWsOutbound(); WsOutbound outFromBound = messageFromInbound.getWsOutbound(); String content = messageMap.get(content); //Den Nachrichteninhalt abrufen String msgContentString = fromName + say: + content; //Den Inhalt senden CharBuffer toMsg = CharBuffer. wrap(msgContentString .toCharArray()); CharBuffer fromMsg = CharBuffer.wrap(msgContentString.toCharArray()); outFromBound.writeTextMessage(fromMsg); outBound.flush(); outbound.flush(); } } @Override protected void onClose(int status) { InitServlet.getSocketList().remove(this) ; super.onClose(status); } @Override protected void onOpen(WsOutbound outbound) { super.onOpen(outbound); //Der angemeldete Benutzer ist registriert if(name!=null){ InitServlet.getSocketList().put(name, this);//Storage-Kundendienst-ID und Benutzer} } @Override public int getReadTimeout( ) { return 0; }
Verarbeiten Sie die vom Vordergrund gesendeten Informationen in onTextMessage und kapseln Sie die Informationen an das Ziel.
Es gibt auch ein Messageutil
package util;import java.nio.CharBuffer;import java.util.HashMap;public class 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[2]);
Selbstverständlich muss auch die Rezeption Informationen im vorgeschriebenen Format übermitteln.
<%@ 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, minimieren);%><script type=text/javascript>var ws = null;function startWebSocket() { if ('WebSocket' im Fenster) ws = new WebSocket(ws://localhost:8080/WebSocketUser/websocket.do); ('MozWebSocket' im Fenster) 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); }; function setMessageInnerHTML(innerHTML){ document.getElementById('message').innerHTML += innerHTML + '<br/>' } ws.onclose = function(evt) { //alert(close); 'denglu').innerHTML=offline }; 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; //An wen gesendet werden soll var content = document.getElementById('writeMsg').value; //Inhalt senden ws.send(fromName+,+toName+,+content);//Achten Sie auf das Format</script></head><body onload=startWebSocket();><p>Chat-Funktionsimplementierung</ p> Anmeldestatus: <span id=denglu style=color:red;>Anmeldung</span><br>Anmeldeperson: <span id=userName></span><br><br><br>An wen : <Eingabetyp=Text id=name value=小明></input><br>Inhalt senden: <input type=text id=writeMsg></input><br>Chat-Box: <div id=message style=height: 250px;width: 280px ;border: 1px solid; overflow: auto;></div><br><input type=button value=send onclick=sendMsg()></input></body></html>
Dies ist die A.jsp-Seite, B ist die gleiche wie oben
Durch den obigen Code kann eine Punkt-zu-Punkt-Chat-Funktion realisiert werden, die in eine Webversion des Chat-Systems umgewandelt werden kann, einschließlich Chatrooms und Einzel-Chats WebSocket unterstützt keine binäre Übertragung, aber ich habe gesehen, dass ein großer Liu so etwas gesagt hat
Aber jetzt habe ich das Gefühl, dass die Verwendung von Binärdateien nicht sehr sinnvoll ist. Ich war lange verwirrt. Es wurde gesagt, dass JS keine Binärdatei unterstützt. Ich habe festgestellt, dass es sich tatsächlich nur um eine Gruppe von Betrügern handelt, die dies nicht studiert haben. . (Mit Filereader)
Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass er für das Studium aller hilfreich ist. Ich hoffe auch, dass jeder das VeVb Wulin Network unterstützt.