بالأمس، استخدمت HTML5 websocket وTomcat لتنفيذ دردشة متعددة الأشخاص، وهو أبسط وأهم شيء يجب الانتباه إليه هو بيئة التطوير، والتي يجب أن تتوافق مع jdk1.7 وtomcat8 سوف تعمل أيضا!
اليوم هو آخر يوم في اليوم الوطني، لذا يجب أن أعمل وقتًا إضافيًا وأستمر في البرمجة! لحسن الحظ، استخدمت Google للعثور على دردشة نظير إلى نظير حول websocket، والأفضل من ذلك هو أنه يمكن أن يعمل بشكل جيد مع معظم الأنظمة.
نظرًا لأنه تمت محاكاته، فإن ما تم تقديمه هنا عبارة عن صفحتين من JSP A وB، مما يضع اسمين Xiaoming وXiahua في الجلسة على التوالي. لاحظ أن الجلسة هنا هي جلسة HttpSession، والجلسة في الدردشة متعددة الأشخاص السابقة هي javax .websocket.Session؛
فكر في الأمر هنا، استخدم جلسة HttpSession للتحكم في مستخدمي الدردشة، خمن ما هي الفوائد ~~~
لا يتم استخدام التعليقات التوضيحية هنا في طريقة تكوين web.xml التقليدية، حيث يتم استدعاء طريقة InitServlet أولاً عند بدء تشغيل النظام.
public class InitServlet Extends HttpServlet { public static Final long serialVersionUID = -3163557381361759907L; super.init(config); System.out.println(initialize chat Container); } public static 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-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 ><!--مستوى تنفيذ الطريقة--> </servlet> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list></web-app>
هذه هي العملية الأكثر شيوعًا التي يقوم بها مكتب الاستقبال لإرسال الطلبات إلى الخلفية، ومن السهل أيضًا تضمينها في نظامك الخاص.
MyWebSocketServlet:
public class MyWebSocketServlet تمديد WebSocketServlet { public String getUser(HttpServletRequest request){ String userName = (String) request.getSession().getAttribute(user);{ return null } return userName } protected StreamInbound createWebSocketInbound (سلسلة arg0، طلب HttpServletRequest) { System.out.println(user + request.getSession().getAttribute(user) +login return new MyMessageInbound(this.getUser(request) }});
يرث MyMessageInbound الرسالة الواردة
مقبس الحزمة;استيراد java.io.IOException;استيراد java.nio.ByteBuffer;استيراد java.nio.CharBuffer;استيراد java.util.HashMap;استيراد org.apache.catalina.websocket.MessageInbound;استيراد org.apache.catalina.websocket .WsOutbound;import util.MessageUtil;الفئة العامة MyMessageInbound تمتد messageInbound { سلسلة خاصة name; public MyMessageInbound() { super(); } public MyMessageInbound(String name) { super(); this.name = name } @Override protected void onBinaryMessage(ByteBuffer arg0) throws IOException { } @Override protected void onTextMessage(CharBuffer). msg) throws IOException { // الخريطة بعد معالجة الرسالة المرسلة من قبل المستخدم HashMap<String,String> messageMap = messageUtil.getMessage(msg); // معالجة فئة الرسالة // خريطة فئة مجموعة المستخدمين عبر الإنترنت HashMap<String, messageInbound> userMsgMap = InitServlet.getSocketList(); String fromName = messageMap.get(fromName); معرف المستخدم للشخص String toName = messageMap.get(toName); // معرف المستخدم الخاص بالشخص الذي تم إرسال الرسالة إليه // احصل على الرسالة الخاصة بالمستخدم messageInbound = userMsgMap.get(toName); // احصل على الرسالة الواردة المرسلة إلى الشخص في المستودع messageInbound messageFromInbound = userMsgMap.get(fromName); العملية WsOutbound outbound = 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(); outbound.flush(); } } @Override protected void onClose(int condition) { InitServlet.getSocketList().remove(this) ; super.onClose(status); } @Override protected void onOpen(WsOutbound outbound) { super.onOpen(outbound); // يتم تسجيل المستخدم الذي قام بتسجيل الدخول if(name!=null){ InitServlet.getSocketList().put(name, this);//معرف خدمة عملاء التخزين والمستخدم} } @Override public int getReadTimeout() { return 0 } }
قم بمعالجة المعلومات المرسلة بواسطة المقدمة في onTextMessage وقم بتغليف المعلومات إلى الهدف.
هناك أيضًا رسالة
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(); msgString.split(,); Map.put(fromName, m[0]); Map.put(toName, m[1]);
وبطبيعة الحال، يجب على مكتب الاستقبال أيضًا نقل المعلومات بالتنسيق المحدد.
<%@ page language=java contentType=text/html; charset=UTF-8 pageEncoding=UTF-8%><!DOCTYPE html><html><head><meta http-equiv=محتوى نوع المحتوى=text/html charset=UTF-8><title>الفهرس</title><script type=text/javascript src=js/jquery-1.7.2.min.js></script><%session.setAttribute(user, Minim);%><script type=text/javascript>var ws = null;function startWebSocket() { if ('WebSocket' في النافذة) ws = new WebSocket(ws://localhost:8080/WebSocketUser/websocket.do); ('MozWebSocket' في النافذة) ws = new MozWebSocket(ws://localhost:8080/WebSocketUser/websocket.do); ); console.log(evt); // $(#xiaoxi).val(evt.data); }; function setMessageInnerHTML(innerHTML){ document.getElementById('message').innerHTML += الداخليHTML + '<br/>' } ws.onclus = function(evt) { //alert(إغلاق document.getElementById(); '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; // لمن يُرسل 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 ;الحدود: 1 بكسل صلب: تلقائي;></div><br><نوع الإدخال=قيمة الزر=إرسال onclick=sendMsg()></input></body></html>
هذه هي صفحة A.jsp، وB هي نفس الصفحة المذكورة أعلاه
من خلال الكود أعلاه، يمكن تحقيق وظيفة الدردشة من نقطة إلى نقطة على نطاق واسع، ويمكن تحويلها إلى إصدار ويب من نظام الدردشة، بما في ذلك غرف الدردشة والمحادثات الفردية لا يدعم websocket النقل الثنائي، لكنني رأيت ليو يقول شيئًا كهذا
لكنني أشعر الآن أن استخدام النظام الثنائي ليس ذا معنى كبير. لقد كنت في حيرة من أمري لفترة طويلة، لقد قيل أن JS لا يدعم النظام الثنائي، ووجدت أنه في الواقع مجرد مجموعة من المحتالين الذين لم يدرسوا هذا الأمر. . (باستخدام قارئ الملفات)
ما ورد أعلاه هو المحتوى الكامل لهذه المقالة وآمل أن يكون مفيدًا لدراسة الجميع وآمل أيضًا أن يدعم الجميع شبكة VeVb Wulin.