Вчера я использовал веб-сокет HTML5 и Tomcat для реализации многопользовательского чата. Самое главное, на что следует обратить внимание, — это среда разработки, которая должна соответствовать jdk1.7 и tomcat8. тоже будет работать!
Сегодня последний день Национального дня, поэтому мне придется работать сверхурочно и продолжать программировать! К счастью, я воспользовался Google, чтобы найти одноранговый чат о веб-сокетах. Что еще лучше, так это то, что он хорошо работает с большинством систем. Взгляните на рендеринг.
Поскольку это моделируется, здесь представлены две страницы JSP A и B, которые помещают в сеанс два имени Сяомин и Сяохуа соответственно. Обратите внимание, что здесь сеанс HttpSession, а сеанс в предыдущем многопользовательском чате — javax. .websocket.Session отличается;
Подумайте об этом, используйте сеанс HttpSession для управления пользователями чата, угадайте, каковы преимущества ~~~
Аннотации здесь не используются. В традиционном методе настройки web.xml метод InitServlet вызывается при запуске системы.
общественный класс InitServlet расширяет HttpServlet {частный статический окончательный длинный сериалVersionUID = -3163557381361759907L; частный статический HashMap<String,MessageInbound> SocketList; super.init(config); System.out.println(инициализировать контейнер чата); } public static HashMap<String,MessageInbound> getSocketList() { return InitServlet.socketList } };
Здесь вы можете объединить его с вашей собственной системой. Соответствующий код веб-конфигурации выглядит следующим образом:
<?xml версия=1.0 кодировка=UTF-8?><версия веб-приложения=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:
общественный класс MyWebSocketServlet расширяет WebSocketServlet {public String getUser (HttpServletRequest request) { String userName = (String) request.getSession(). GetAttribute (пользователь); if (userName == null) { return null; } return userName } protected StreamInbound createWebSocketInbound; (Строка arg0, запрос HttpServletRequest) { System.out.println(пользователь + request.getSession().getAttribute(пользователь) + логин); return new MyMessageInbound(this.getUser(request) }};
MyMessageInbound наследует MessageInbound
сокет пакета;импорт 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(); msg) throws 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); //Идентификатор пользователя, которому отправлено сообщение //Получить MessageInbound пользователя messageInbound = userMsgMap.get(toName); //Получаем MessageInbound, отправленное человеку на складе MessageInbound messageFromInbound = userMsgMap.get(fromName); if(messageInbound!=null && messageFromInbound!=null){ //Если отправитель существует, выполняем операция WsOutbound outbound = messageInbound.getWsOutbound() WsOutbound outFromBound =; messageFromInbound.getWsOutbound(); String content = messageMap.get(content); //Получаем содержимое сообщения String msgContentString = fromName +say: + content; //Создаем сообщение для отправки //Отправляем содержимое CharBuffer вMsg = 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 status) { InitServlet.getSocketList().remove(this) ; super.onClose(статус); } @Override protected void onOpen(WsOutbound) {; super.onOpen(outbound); //Вошедший в систему пользователь зарегистрирован if(name!=null){ InitServlet.getSocketList().put(name, this);//Идентификатор и пользователь службы хранилища} } @Override public int getReadTimeout() {возвращение 0 } }
Обработайте информацию, отправленную на переднем плане, в onTextMessage и инкапсулируйте ее в цель.
Также есть 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> (); Строка msgString = msg.toString(); Строка m[] =; msgString.split(,);map.put(fromName,m[0]);map.put(toName,m[1]);map.put(content,m[2]);
Разумеется, стойка регистрации также должна передавать информацию в установленном формате.
<%@ 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>Индекс</title><script type=text/javascript src=js/jquery-1.7.2.min.js></script><%session.setAttribute(user, минимизировать);%><script type=text/javascript>var ws = null;function startWebSocket() { if («WebSocket» в окне) ws = новый WebSocket(ws://localhost:8080/WebSocketUser/websocket.do else if); ('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(close); 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;ширина: 280px ;граница: сплошная 1 пиксель; переполнение: авто;></div><br><тип ввода=значение кнопки=отправить onclick=sendMsg()></input></body></html>
Это страница A.jsp, B такая же, как указано выше.
С помощью приведенного выше кода можно реализовать функцию двухточечного чата, если она крупномасштабная, ее можно превратить в веб-версию чат-системы, включая чаты и чаты для одного человека. вебсокет не поддерживает двоичную передачу, но я видел, как большой Лю сказал что-то вроде этого
Но теперь я чувствую, что использование двоичного кода не имеет особого смысла. Я долго путался. Было сказано, что JS не поддерживает двоичный код. Я обнаружил, что это на самом деле просто кучка мошенников, которые этого не изучали. . (Используя программу чтения файлов)
Выше приведено все содержание этой статьи. Я надеюсь, что она будет полезна для изучения всеми. Я также надеюсь, что все поддержат сеть VeVb Wulin.