เมื่อวานนี้ ฉันใช้ HTML5 websocket และ Tomcat เพื่อใช้งานการแชทแบบหลายคน มันเป็นวิธีที่ง่ายที่สุดและพื้นฐานที่สุดที่ต้องใส่ใจคือสภาพแวดล้อมการพัฒนา ซึ่งจะต้องเป็นไปตาม jdk1.7 และ tomcat8 แน่นอน จะทำงานด้วย!
วันนี้เป็นวันสุดท้ายของวันชาติ ฉันต้องทำงานล่วงเวลาและเขียนโค้ดต่อ! โชคดีที่ฉันใช้ Google เพื่อค้นหาการสนทนาแบบ peer-to-peer เกี่ยวกับ websocket สิ่งที่ดีไปกว่านั้นคือมันสามารถทำงานได้ดีกับระบบส่วนใหญ่ ลองดูที่การเรนเดอร์
เนื่องจากเป็นการจำลอง สิ่งที่ให้ไว้ที่นี่คือเพจ JSP สองหน้า A และ B ซึ่งใส่ชื่อสองชื่อ Xiaoming และ Xiaohua ไว้ในเซสชันตามลำดับ โปรดทราบว่าเซสชันที่นี่คือเซสชัน HttpSession และเซสชันในการแชทแบบหลายคนก่อนหน้านี้คือ javax .websocket.Session แตกต่างออกไป
ลองคิดดูที่นี่ ใช้เซสชัน HttpSession เพื่อควบคุมผู้ใช้แชท เดาว่ามีประโยชน์อะไรบ้าง~~~~
คำอธิบายประกอบไม่ได้ใช้ที่นี่ ในวิธีการกำหนดค่า web.xml แบบเดิม วิธี InitServlet จะถูกเรียกครั้งแรกเมื่อระบบเริ่มทำงาน
คลาสสาธารณะ InitServlet ขยาย HttpServlet { ส่วนตัวคงที่สุดท้าย serialVersionUID = -3163557381361759907L; super.init(config); System.out.println(เตรียมใช้งานคอนเทนเนอร์แชท); } HashMap สาธารณะ<String,MessageInbound> getSocketList() { return InitServlet.socketList;
ที่นี่คุณสามารถรวมเข้ากับระบบของคุณเองได้ รหัสการกำหนดค่าเว็บที่เกี่ยวข้องมีดังนี้:
<?xml version=1.0 encoding=UTF-8?><web-app version=3.0 xmlns=http://java.sun.com/xml/ns/javaee xmlns:xsi=http://www.w3.org /2001/XMLSchema-อินสแตนซ์ 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 ><!--ระดับการดำเนินการเมธอด--> </servlet> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </ยินดีต้อนรับ-รายการไฟล์></เว็บแอป>
นี่เป็นกระบวนการที่พบบ่อยที่สุดสำหรับแผนกต้อนรับในการส่งคำขอไปยังเบื้องหลัง และยังง่ายต่อการฝังลงในระบบของคุณเอง
MyWebSocketServlet:
คลาสสาธารณะ MyWebSocketServlet ขยาย WebSocketServlet { สตริงสาธารณะ getUser (คำขอ HttpServletRequest) { ชื่อผู้ใช้สตริง = (สตริง) request.getSession().getAttribute(user); if(userName==null){ return null; } ป้องกัน StreamInbound createWebSocketInbound (สตริง arg0 คำขอ HttpServletRequest) { System.out.println(ผู้ใช้ + request.getSession().getAttribute(ผู้ใช้) + เข้าสู่ระบบ); ส่งคืน MyMessageInbound ใหม่(this.getUser(คำขอ) }}
MyMessageInbound สืบทอด MessageInbound
ซ็อกเก็ตแพ็คเกจ; นำเข้า java.io.IOException; นำเข้า java.nio.ByteBuffer; นำเข้า java.nio.CharBuffer; นำเข้า java.util.HashMap; นำเข้า org.apache.catalina.websocket.MessageInbound; นำเข้า org.apache.catalina.websocket .WsOutbound; นำเข้า util.MessageUtil; คลาสสาธารณะ MyMessageInbound ขยาย MessageInbound { สตริงส่วนตัว ชื่อ; สาธารณะ MyMessageInbound() { super(); } สาธารณะ MyMessageInbound(ชื่อสตริง) { super(); this.name = name; } @Override protected void onBinaryMessage(ByteBuffer arg0) พ่น IOException { } @Override protected void onTextMessage(CharBuffer) msg) พ่น IOException { //แผนที่หลังจากประมวลผลข้อความที่ส่งโดยผู้ใช้ HashMap<String,String> messageMap = MessageUtil.getMessage(msg); //กำลังประมวลผลคลาสข้อความ //แผนที่คลาสคอลเลกชันผู้ใช้ออนไลน์ HashMap<String, MessageInbound> userMsgMap = InitServlet.getSocketList(); String fromName = messageMap.get(fromName); userId ของบุคคล String toName = messageMap.get(toName); //The userId ของบุคคลที่ส่งข้อความถึง //รับ MessageInbound messageInbound ของผู้ใช้ = userMsgMap.get(toName); //รับ MessageInbound ที่ส่งถึงบุคคลในคลังสินค้า MessageInbound messageFromInbound = userMsgMap.get(fromName); if(messageInbound!=null && messageFromInbound!=null){ //หากผู้ส่งมีอยู่ ให้ดำเนินการ การดำเนินการ WsOutbound ขาออก = messageInbound.getWsOutbound(); WsOutbound outFromBound = messageFromInbound.getWsOutbound(); String content = messageMap.get(content); // รับเนื้อหาข้อความ String msgContentString = fromName + say: + content; // สร้างข้อความที่จะส่ง CharBuffer toMsg = CharBuffer wrap(msgContentString .toCharArray()); CharBuffer fromMsg = CharBuffer.wrap(msgContentString.toCharArray()); outFromBound.writeTextMessage(fromMsg); outbound.writeTextMessage(toMsg); // outFromBound.flush(); } @แทนที่การป้องกันเป็นโมฆะ onClose(int สถานะ) { InitServlet.getSocketList().remove(นี้) ; super.onClose (สถานะ); } @Override ป้องกันเป็นโมฆะ onOpen (WsOutbound ขาออก) { super.onOpen(outbound); //ผู้ใช้ที่เข้าสู่ระบบได้ลงทะเบียนแล้ว if(name!=null){ InitServlet.getSocketList().put(name, this);//Storage customer service ID and user} } @Override public int getReadTimeout( ) { กลับ 0;
ประมวลผลข้อมูลที่ส่งโดยเบื้องหน้าใน onTextMessage และสรุปข้อมูลไปยังเป้าหมาย
นอกจากนี้ยังมี messageutil
package util; นำเข้า java.nio.CharBuffer; นำเข้า java.util.HashMap; MessageUtil คลาสสาธารณะ { HashMap สาธารณะคงที่ <String, String> getMessage (CharBuffer msg) { HashMap <String, String> map = ใหม่ HashMap <String, String> (); สตริง msgString = msg.toString(); สตริง m[] = msgString.split(,); map.put(fromName, m[0]); map.put(toName, m[1]); map.put(เนื้อหา, m[2]);
แน่นอนว่าแผนกต้อนรับส่วนหน้าจะต้องส่งข้อมูลตามรูปแบบที่กำหนดด้วย
<%@ ภาษาหน้า=java contentType=text/html; charset=UTF-8 pageEncoding=UTF-8%><!DOCTYPE html><html><head><meta http-equiv=เนื้อหาประเภทเนื้อหา=ข้อความ/html ; charset=UTF-8><title>ดัชนี</title><script type=text/javascript src=js/jquery-1.7.2.min.js></script><%session.setAttribute(ผู้ใช้, ย่อ);%><script type=text/javascript>var ws = null;function startWebSocket() { ถ้า ('WebSocket' ในหน้าต่าง) ws = new WebSocket(ws://localhost:8080/WebSocketUser/websocket.do); ('MozWebSocket' ในหน้าต่าง) 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(ปิด); 'denglu').innerHTML=ออฟไลน์; }; document.getElementById('denglu').innerHTML=online; document.getElementById('userName').innerHTML='xiaohua'; };}ฟังก์ชัน sendMsg() { var fromName = xiaoxing; ').value; //ถึงผู้ที่จะส่ง var content = document.getElementById('writeMsg').value; //ส่งเนื้อหา ws.send(fromName+,+toName+,+content);//ให้ความสนใจกับรูปแบบ</script></head><body onload=startWebSocket();><p>การใช้งานฟังก์ชันแชท</ p> สถานะการเข้าสู่ระบบ: <span id=denglu style=color:red;>การเข้าสู่ระบบ</span><br>บุคคลที่เข้าสู่ระบบ: <span id=userName></span><br><br><br>ถึงใคร : < ประเภทอินพุต=ข้อความ id=name value=小明></input><br>ส่งเนื้อหา: <input type=text id=writeMsg></input><br>กล่องแชท: <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>
นี่คือหน้า A.jsp B เหมือนกับด้านบน
ด้วยโค้ดข้างต้น ฟังก์ชันการแชทแบบจุดต่อจุดสามารถรับรู้ได้ หากมีขนาดใหญ่ ก็สามารถสร้างเป็นระบบแชทเวอร์ชันเว็บได้ รวมถึงห้องสนทนาและการแชทแบบคนเดียว websocket ไม่รองรับการส่งไบนารี่ แต่ฉันเห็นหลิวตัวใหญ่พูดแบบนี้
แต่ตอนนี้ฉันรู้สึกว่าการใช้ไบนารี่ไม่มีความหมายมากนัก ฉันสับสนมานานแล้วว่ากันว่า JS ไม่รองรับไบนารี่ ฉันพบว่าจริงๆ แล้วเป็นเพียงกลุ่มหลอกลวงที่ไม่ได้ศึกษาเรื่องนี้ - (ใช้โปรแกรมอ่านไฟล์)
ข้างต้นคือเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการศึกษาของทุกคน ฉันหวังว่าทุกคนจะสนับสนุน VeVb Wulin Network