Ontem usei websocket HTML5 e Tomcat para implementar o chat multipessoa. É o mais simples e básico. O mais importante a se prestar atenção é o ambiente de desenvolvimento, que deve atender ao jdk1.7 e tomcat8. também funcionará!
Hoje é o último dia do Dia Nacional, então tenho que fazer hora extra e continuar codificando! Felizmente, usei o Google para encontrar bate-papo ponto a ponto sobre o websocket. O melhor de tudo é que ele pode funcionar bem com a maioria dos sistemas.
Por ser simulado, o que é fornecido aqui são duas páginas JSP A e B, que colocam dois nomes Xiaoming e Xiaohua na sessão, respectivamente. Observe que a sessão aqui é a sessão HttpSession e a sessão no bate-papo multipessoal anterior é javax. .websocket.Session é diferente.
Pense nisso aqui, use a sessão HttpSession para controlar os usuários do chat, adivinhe quais são os benefícios ~~~
As anotações não são usadas aqui. No método de configuração web.xml tradicional, o método InitServlet é chamado primeiro quando o sistema é iniciado.
classe pública InitServlet estende HttpServlet { private static final long serialVersionUID = -3163557381361759907L; private static HashMap<String,MessageInbound> socketList; super.init(config); System.out.println(inicializar contêiner de bate-papo); public static HashMap<String,MessageInbound> getSocketList() { return InitServlet.socketList;
Aqui você pode combiná-lo com seu próprio sistema. O código de configuração da web correspondente é o seguinte:
<?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 ><!--Nível de execução do método--> </servlet> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list></web-app>
Este é o processo mais comum para a recepção enviar solicitações em segundo plano e também é fácil de incorporar ao seu próprio sistema.
MeuWebSocketServlet:
classe pública MyWebSocketServlet estende WebSocketServlet { public String getUser(HttpServletRequest request){ String userName = (String) request.getSession().getAttribute(user); (String arg0, solicitação HttpServletRequest) { System.out.println(usuário + request.getSession().getAttribute(usuário) + login); retornar new MyMessageInbound(this.getUser(request));
MyMessageInbound herda MessageInbound
soquete do pacote;importar java.io.IOException;importar java.nio.ByteBuffer;importar java.nio.CharBuffer;importar java.util.HashMap;importar org.apache.catalina.websocket.MessageInbound;importar org.apache.catalina.websocket .WsOutbound;importar util.MessageUtil;classe pública MyMessageInbound estende MessageInbound { private String nome; public MyMessageInbound() { super() } public MyMessageInbound(String nome) { super(); msg) throws IOException { //O mapa após o processamento da mensagem enviada pelo usuário HashMap<String,String> messageMap = MessageUtil.getMessage(msg); //Processando classe de mensagem //Mapa de classe de coleção de usuários online HashMap<String, MessageInbound> userMsgMap = InitServlet.getSocketList(); userId da pessoa String toName = messageMap.get(toName); //O userId da pessoa para quem a mensagem é enviada //Obter o MessageInbound do usuário messageInbound = userMsgMap.get(toName); //Obter o MessageInbound enviado para a pessoa no warehouse MessageInbound messageFromInbound = userMsgMap.get(fromName); a operação WsOutbound outbound = messageInbound.getWsOutbound(); messageFromInbound.getWsOutbound(); String content = messageMap.get(content); //Obter o conteúdo da mensagem String msgContentString = fromName + say: + content; wrap(msgContentString.toCharArray()); CharBuffer fromMsg = CharBuffer.wrap(msgContentString.toCharArray()); outFromBound.writeTextMessage(fromMsg); outbound.writeTextMessage(toMsg); // outFromBound.flush(); outbound.flush(); ; super.onClose(status); @Override protegido void onOpen(WsOutbound saída) { super.onOpen(outbound); //O usuário logado é registrado if(name!=null){ InitServlet.getSocketList().put(name, this);//ID e usuário do atendimento ao cliente de armazenamento} } @Override public int getReadTimeout() { retornar 0;
Processe as informações enviadas pelo primeiro plano em onTextMessage e encapsule as informações para o destino.
Há também um messageutil
pacote util;importar java.nio.CharBuffer;importar 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]);
É claro que a recepção também deve transmitir informações no formato prescrito.
<%@ 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>Índice</title><script type=text/javascript src=js/jquery-1.7.2.min.js></script><%session.setAttribute(user, minimize);%><script type=text/javascript>var ws = null;function startWebSocket() { if ('WebSocket' na janela) ws = new WebSocket(ws://localhost:8080/WebSocketUser/websocket.do); ('MozWebSocket' na janela) ws = new MozWebSocket(ws://localhost:8080/WebSocketUser/websocket.do); else alert(not support); );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; ').value; //Para quem enviar var content = document.getElementById('writeMsg').value; //Enviar conteúdo ws.send(fromName+,+toName+,+content);//Preste atenção ao formato}</script></head><body onload=startWebSocket();><p>Implementação da função de chat</ p> Status de login: <span id=denglu style=color:red;>Efetuando login</span><br>Pessoa de login: <span id=userName></span><br><br><br>Para quem : < tipo de entrada = texto id=name value=小明></input><br>Enviar conteúdo: <input type=text id=writeMsg></input><br>Caixa de bate-papo: <div id=message style=height: 250px;largura: 280px ;border: 1px sólido; overflow: auto;></div><br><input type=button value=send onclick=sendMsg()></input></body></html>
Esta é a página A.jsp, B é igual à acima
Através do código acima, uma função de chat ponto a ponto pode ser realizada. Se for em grande escala, pode ser transformada em uma versão web do sistema de chat, incluindo salas de chat e chats individuais. websocket não suporta transmissão binária, mas vi um grande Liu dizer algo assim
Mas agora sinto que usar binário não faz muito sentido. Estou confuso há muito tempo. Foi dito que JS não suporta binário. Descobri que na verdade são apenas um bando de golpistas que não estudaram isso. . (Usando leitor de arquivos)
O texto acima é todo o conteúdo deste artigo. Espero que seja útil para o estudo de todos. Também espero que todos apoiem a Rede VeVb Wulin.