ก่อนอื่นฉันอยากจะประกาศให้คุณทราบ: จำเป็นต้องใช้ JDK 7, Tomcat จำเป็นต้องสนับสนุนเวอร์ชัน WebSocket
1.initservlet
คลาสนี้ส่วนใหญ่จะใช้เพื่อเริ่มต้นที่เก็บแผนที่ที่สร้างการจัดเก็บข้อมูลในอนาคตของข้อมูลตัวตนของผู้ใช้ใช้วิธีการเริ่มต้นเริ่มต้นเพื่อเริ่มต้นที่เก็บข้อมูลและใช้วิธีการคงที่ getSocketList เพื่อรับข้อมูลตัวตนของผู้ใช้ที่สอดคล้องกัน
WebSocket ฉันคิดว่า MessageInbound ใช้เพื่อระบุข้อมูลของการเข้าสู่ระบบใช้เพื่อค้นหาบุคคลที่เกี่ยวข้องและข้อความพุช การเข้าสู่ระบบแต่ละครั้งจะสร้างข้อความระหว่าง
ที่นี่ hashmap <string, messageinbound>: สตริงเก็บรหัสเข้าสู่ระบบของเซสชันผู้ใช้และ MessageInbound จัดเก็บข้อมูลประจำตัวที่จำเป็นสำหรับการผลักดัน ข้างต้นคือความเข้าใจในช่องปากส่วนตัว
แพ็คเกจซ็อกเก็ต; นำเข้า java.nio.charbuffer; นำเข้า java.util.arraylist; นำเข้า java.util.hashmap; นำเข้า java.util.list; นำเข้า Javax.servlet.servletConfig; นำเข้า javax.servlet.servletexception; นำเข้า Javax.servlet.http.httpservlet; นำเข้า org.apache.catalina.websocket.messageinbound; คลาสสาธารณะ InitServlet ขยาย Httpservlet {ส่วนตัวคงที่สุดท้าย Long SerialVersionUid = -l; // รายการคงที่ส่วนตัว <SessageInbound> SocketList; HashMap แบบคงที่ส่วนตัว <String, MessageInbound> SocketList; โมฆะสาธารณะ init (servletConfig config) พ่น servletexception {// initservlet.socketList = new ArrayList <S MessageInbound> (); initServlet.socketList = new hashmap <string, messageinbound> (); super.init (config); System.out.println ("เซิร์ฟเวอร์เริ่มต้น ============="); } Public Static HashMap <String, MessageInbound> getSocketList () {return initServlet.socketList; } /* รายการคงที่สาธารณะ <SessageInbound> getSocketList () {return initServlet.socketList; - 2. MywebsocketServlet
WebSocket ใช้เพื่อสร้างการเชื่อมต่อ servlet เมื่อสร้างการเชื่อมต่อก่อนอื่นรับ UserID ของการเข้าสู่ระบบในเซสชันและส่งผ่าน USERID เมื่อเรียก MyMessageInbound Constructor
แพ็คเกจซ็อกเก็ต; นำเข้า java.io.ioException; นำเข้า java.io.printwriter; นำเข้า java.nio.charbuffer; นำเข้า javax.servlet.servletexception; นำเข้า Javax.servlet.http.httpservlet; นำเข้า javax.servlet.http.httpservletrequest; นำเข้า Javax.servlet.http.httpservletResponse; นำเข้า org.apache.catalina.websocket.streaminbound; นำเข้า org.apache.catalina.websocket.websocketServlet; / ** * * @className: MyWebSocketServlet * @description: สร้างขึ้นเมื่อสร้างการเชื่อมต่อ * @author mangues * @date - */ คลาสสาธารณะ mywebsocketServlet ขยาย WebSocketServlet {Public String GetUser if (ชื่อผู้ใช้ == null) {return null; } ส่งคืนชื่อผู้ใช้; // return (string) request.getAttribute ("ผู้ใช้"); } @Override ได้รับการป้องกัน streaminbound createWebsocketInbound (String arg, คำขอ httpservletRequest) {system.out.println ("################# ส่งคืน myMessageInbound ใหม่ (this.getUser (คำขอ)); - 3. วิธีการ Onopen เรียกที่เก็บข้อมูลประจำตัวแผนที่ของ InitServlet
ใส่ผู้ใช้ USERID และข้อมูลประจำตัว WebSocket ที่สอดคล้องกับข้อความผู้ใช้ที่เข้าสู่ระบบ (สามารถใช้ USERID เพื่อค้นหาข้อมูลประจำตัวที่จำเป็นสำหรับการกด MessageInbound)
OnTextMessage: ใช้เพื่อรับข้อความและส่งข้อความ
แพ็คเกจซ็อกเก็ต; นำเข้า 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 = ชื่อ; } @Override void onbinaryMessage (bytebuffer arg) พ่น ioexception {// toDo วิธีการที่สร้างขึ้นอัตโนมัติ stub} @Override ป้องกันโมฆะ ontextMessage (Charbuffer msg) โยน ioexception {// แผนที่ // การประมวลผลคลาสข้อความ // การรวบรวมคลาสการรวบรวมผู้ใช้ HASHMAP <String, MessageInbound> USERMSGMAP = InitServlet.getSocketList (); สตริง fromName = messageMap.get ("fromName"); // ข้อความมาจากสตริง userId toname = messageMap.get ("toname"); // ข้อความจะถูกส่งไปยังผู้ใช้ของผู้ใช้ // รับข้อความ usermessageInbound ข้อความ INBOUND = USERMSGMAP.GET (toname); // ข้อความที่ส่งไปยังผู้ใช้ในคลังสินค้าถ้า (MessageInbound! = null) {// หากข้อความมีอยู่กับผู้ใช้ให้ดำเนินการทำงาน wsoutbound outbound = messageInbound.getWsoutbound (); เนื้อหาสตริง = messageMap.get ("เนื้อหา"); // รับสตริงเนื้อหาข้อความ msgContentString = fromName + "" + เนื้อหา; // สร้างข้อความที่ส่ง // ส่งเนื้อหา charbuffer tomsg = charbuffer.wrap (msgcontentstring.tochararray ()); outbound.writeTextMessage (TOMSG); // outbound.flush (); } /* สำหรับ (MessageInbound MessageInbound: initServlet.getSocketList ()) {charbuffer buffer = charbuffer.wrap (msg); wsoutbound outbound = messageinbound.getWsoutbound (); outbound.writeTextMessage (บัฟเฟอร์); outbound.flush (); } */} @Override Void onClose (สถานะ int) {initServlet.getSocketList (). ลบ (นี่); super.onclose (สถานะ); } @Override Void Protected Onopen (WSOutbound ขาออก) {super.onopen (ขาออก); // เข้าสู่ระบบใน if (name! = null) {initServlet.getSocketList (). ใส่ (ชื่อนี้); } // initServlet.getSocketList (). เพิ่ม (นี่); - 4. คลาสการประมวลผลข้อความข้อความการประมวลผลที่ส่งโดย front-end
แพ็คเกจ util; นำเข้า java.nio.charbuffer; นำเข้า java.util.hashmap; / ** * * @className: MessageUtil * @description: คลาสการประมวลผลข้อความ * @author mangues * @date - */ คลาสสาธารณะ MessageUtil {Public Static HashMap <String, String> getMessage (Charbuffer msg) สตริง m [] = msgstring.split (","); map.put ("fromName", m []); map.put ("toname", m []); map.put ("เนื้อหา", m []); แผนที่กลับ; - 5. การกำหนดค่าเว็บ
<? xml เวอร์ชัน = "1.0" การเข้ารหัส = "utf-8"?> <web-app version = "3.0" xmlns = "http://java.sun.com/xml/ns/javaee" xmlns: xsi = "http://ww.w3.org/200 XSI: schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" <servlet-class> socket.mywebsocketservlet </servlet-lass> </servlet> <servlet-mapping> <servlet-name> mywebsocket </servlet-name> <url-pattern>*. ทำ </url-pattern> </servlet-mapping> <servlet> <servlet-class> socket.initservlet </servlet-class> <load-on-startup> 1 </load-on-startup> </servlet> <welcome-file-list> <welcome-file> index.jsp </welcome-file>
6. front-end เพื่อความสะดวกฉันใช้ JSP สองตัวโดยตรงและใช้ <%session.setAttribute ("ผู้ใช้", "Xiao Ming")%> เพื่อระบุการเข้าสู่ระบบ
ไม่มีความแตกต่างที่สำคัญระหว่าง JSP สองตัวมันถูกใช้เพื่อระบุว่ามีคนสองคนเข้าสู่ระบบคุณสามารถเปิด JSP ที่แตกต่างกันในเบราว์เซอร์เดียวกันเพื่อแชท
A. ลดน้อยที่สุด
<%@ page language = "java" contentType = "text/html; charset = utf-" pageencoding = "utf-"%> <! doctype html> <html> <head> <meta http-equiv = "content-type type type = "text/javascript" src = "js/jQuery ... min.js"> </script> <%session.setAttribute ("ผู้ใช้", "ย่อเล็กสุด");%> <script type = "text/javascript"> var ws = null; ฟังก์ชั่น startWebSocket () {ถ้า ('webSocket' ในหน้าต่าง) ws = ใหม่ webSocket ("ws: // localhost: /websocket/mywebsocket.do"); อื่นถ้า ('mozwebsocket' ในหน้าต่าง) ws = ใหม่ mozwebsocket ("ws: // localhost:/websocket/mywebsocket.do"); การแจ้งเตือนอื่น ("ไม่สนับสนุน"); ws.onMessage = function (evt) {//alert(evt.data); console.log (evt); $ ("#xiaoxi"). val (evt.data); - ws.onclose = function (evt) {// alert ("ปิด"); document.getElementById ('denglu'). innerhtml = "ออฟไลน์"; - ws.onopen = function (evt) {// alert ("เปิด"); document.getElementById ('denglu'). innerhtml = "ออนไลน์"; document.getElementById ('ชื่อผู้ใช้'). innerhtml = 'ย่อเล็กสุด'; - } ฟังก์ชั่น sendmsg () {var fromName = "ย่อเล็กสุด"; var toname = document.getElementById ('ชื่อ') ค่า; // ส่งไปยังผู้ที่ var content = document.getElementById ('writemsg') ค่า; // ส่งเนื้อหา ws.send (fromname+","+toname+","+เนื้อหา); } </script> </head> <body onload = "startWebSocket ();"> <p> การใช้งานฟังก์ชั่นการแชท </p> สถานะการเข้าสู่ระบบ: <span id = "denglu" style = "สี: สีแดง"> ล็อกอิน </span> value = "Xiao Ming"> </input> <br> ส่งเนื้อหา: <อินพุต type = "text" id = "writemsg"> </อินพุต> <br> กล่องแชท: <textarea rows = "" cols = "readonly id =" xiaoxi "> </textarea> <br> </html> B. Xiao Ming
<%@ page language = "java" contentType = "ข้อความ/html; charset = utf-8" pageencoding = "utf-8"%> <! doctype html> <html> <head> <meta http-equiv = "content-type" content = "text type = "text/javascript" src = "js/jQuery 2.1.1.min.js"> </script> <%session.setAttribute ("ผู้ใช้", "xiao ming");%> <script type = "javascript" WebSocket ("ws: // localhost: 8080/websocket/mywebsocket.do"); อื่นถ้า ('mozwebsocket' ในหน้าต่าง) ws = ใหม่ mozwebsocket ("ws: // localhost: 8080/websocket/mywebsocket.do"); การแจ้งเตือนอื่น ("ไม่สนับสนุน"); ws.onMessage = function (evt) {console.log (evt); //alert(evt.data); $ ("#xiaoxi"). val (evt.data); - ws.onclose = function (evt) {// alert ("ปิด"); document.getElementById ('denglu'). innerhtml = "ออฟไลน์"; - ws.onopen = function (evt) {// alert ("เปิด"); document.getElementById ('denglu'). innerhtml = "ออนไลน์"; document.getElementById ('ชื่อผู้ใช้'). innerhtml = "Xiao Ming"; };} ฟังก์ชั่น sendmsg () {var fromName = "Xiao Ming"; var toname = document.getElementById ('ชื่อ') ค่า; // ส่งไปยังผู้ที่ var content = document.getElementById ('writemsg') ค่า; // ส่งเนื้อหา ws.send (fromname+","+toname+","+เนื้อหา);} </script> </head> <body onload = "startWebsocket ();"> <p> ฟังก์ชั่นการแชทการใช้งาน </p> เข้าสู่ระบบเข้าสู่ระบบ id = "ชื่อผู้ใช้"> </span> <br> <br> <br> ส่งไปที่: <อินพุตประเภท = "ข้อความ" id = "ชื่อ" value = "ย่อเล็กสุด"> </อินพุต> <br> ส่งเนื้อหา: <อินพุต type = "text" id = "writemsg"> </input> <br> id = "xiaoxi"> </textarea> <br> <input type = "ปุ่ม" value = "ส่ง" onclick = "sendmsg ()"> </input> </body> </html>ข้างต้นเป็นความรู้ที่เกี่ยวข้องเกี่ยวกับการใช้ Javaweb WebSocket เพื่อใช้รหัสฟังก์ชั่นการแชทแบบเพียร์ทูเพียร์แบบง่าย ๆ ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับทุกคนในเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!