美文网首页javaWeb学习Java 杂谈我爱编程
解析使用JavaWeb webSocket实现简易的点对点聊天功

解析使用JavaWeb webSocket实现简易的点对点聊天功

作者: 994d14631d16 | 来源:发表于2018-04-03 11:49 被阅读16次

  首先给大家说一下:需要jdk7,tomcat需要支持websocket的版本,那么下面我们来看一下关于使用JavaWeb webSocket实现简易的点对点聊天功能实例代码吧。

  1、InitServlet

  该类主要是用来初始化构造将来存储用户身份信息的map仓库,利用其初始化方法Init初始化仓库,利用其静态方法getSocketList获得对应的用户身份信息。

  webSocket,我认为MessageInbound用来识别登录人的信息,用它来找到对应的人,推送消息。每次登录都会产生一个MessageInbound。

  这里的HashMap:string存储用户session的登录id,MessageInbound存储推送需要的身份信息。以上属于个人口头话理解。

  packagesocket;

  importjava.nio.CharBuffer;

  importjava.util.ArrayList;

  importjava.util.HashMap;

  importjava.util.List;

  importjavax.servlet.ServletConfig;

  importjavax.servlet.ServletException;

  importjavax.servlet.http.HttpServlet;

  importorg.apache.catalina.websocket.MessageInbound;

  publicclassInitServletextendsHttpServlet{

  privatestaticfinallongserialVersionUID=-L;

  //privatestaticListsocketList;

  privatestaticHashMapsocketList;

  publicvoidinit(ServletConfigconfig)throwsServletException{

  //InitServlet.socketList=newArrayList();

  InitServlet.socketList=newHashMap();

  super.init(config);

  System.out.println("Serverstart============");

  }

  publicstaticHashMapgetSocketList(){

  returnInitServlet.socketList;

  }

  /*publicstaticListgetSocketList(){

  returnInitServlet.socketList;

  }

  */}

  2、MyWebSocketServlet

  websocket用来建立连接的servlet,建立连接时,首先在session获取该登录人的userId,在调用MyMessageInbound构造函数传入userId

  packagesocket;

  importjava.io.IOException;

  importjava.io.PrintWriter;

  importjava.nio.CharBuffer;

  importjavax.servlet.ServletException;

  importjavax.servlet.http.HttpServlet;

  importjavax.servlet.http.HttpServletRequest;

  importjavax.servlet.http.HttpServletResponse;

  importorg.apache.catalina.websocket.StreamInbound;

  importorg.apache.catalina.websocket.WebSocketServlet;

  /**

  *

  *@ClassName:MyWebSocketServlet

  *@Description:建立连接时创立

  *@authormangues

  *@date--

  */

  publicclassMyWebSocketServletextendsWebSocketServlet{

  publicStringgetUser(HttpServletRequestrequest){

  StringuserName=(String)request.getSession().getAttribute("user");

  if(userName==null){

  returnnull;

  }

  returnuserName;

  //return(String)request.getAttribute("user");

  }

  @Override

  protectedStreamInboundcreateWebSocketInbound(Stringarg,

  HttpServletRequestrequest){

  System.out.println("##########");

  returnnewMyMessageInbound(this.getUser(request));

  }

  }

 3、onOpen方法调用InitServlet的map身份仓库

  放入用户userId和对应该登录用户的websocket身份信息MessageInbound(可以用userId来寻找到推送需要的身份MessageInbound)

  onTextMessage:用来获取消息,并发送消息

  packagesocket;

  importjava.io.IOException;

  importjava.nio.ByteBuffer;

  importjava.nio.CharBuffer;

  importjava.util.HashMap;

  importorg.apache.catalina.websocket.MessageInbound;

  importorg.apache.catalina.websocket.WsOutbound;

  importutil.MessageUtil;

  publicclassMyMessageInboundextendsMessageInbound{

  privateStringname;

  publicMyMessageInbound(){

  super();

  }

  publicMyMessageInbound(Stringname){

  super();

  this.name=name;

  }

  @Override

  protectedvoidonBinaryMessage(ByteBufferarg)throwsIOException{

  //TODOAuto-generatedmethodstub

  }

  @Override

  protectedvoidonTextMessage(CharBuffermsg)throwsIOException{

  //用户所发消息处理后的map

  HashMapmessageMap=MessageUtil.getMessage(msg);//处理消息类

  //上线用户集合类map

  HashMapuserMsgMap=InitServlet.getSocketList();

  StringfromName=messageMap.get("fromName");//消息来自人的userId

  StringtoName=messageMap.get("toName");//消息发往人的userId

  //获取该用户

  MessageInboundmessageInbound=userMsgMap.get(toName);//在仓库中取出发往人的MessageInbound

  if(messageInbound!=null){//如果发往人存在进行操作

  WsOutboundoutbound=messageInbound.getWsOutbound();

  Stringcontent=messageMap.get("content");//获取消息内容

  StringmsgContentString=fromName+""+content;//构造发送的消息

  //发出去内容

  CharBuffertoMsg=CharBuffer.wrap(msgContentString.toCharArray());

  outbound.writeTextMessage(toMsg);//

  outbound.flush();

  }

  /*for(MessageInboundmessageInbound:InitServlet.getSocketList()){

  CharBufferbuffer=CharBuffer.wrap(msg);

  WsOutboundoutbound=messageInbound.getWsOutbound();

  outbound.writeTextMessage(buffer);

  outbound.flush();

  }*/

  }

  @Override

  protectedvoidonClose(intstatus){

  InitServlet.getSocketList().remove(this);

  super.onClose(status);

  }

  @Override

  protectedvoidonOpen(WsOutboundoutbound){

  super.onOpen(outbound);

  //登录的用户注册进去

  if(name!=null){

  InitServlet.getSocketList().put(name,this);

  }

  //InitServlet.getSocketList().add(this);

  }

  }

4、消息处理类,处理前端发来的消息

  packageutil;

  importjava.nio.CharBuffer;

  importjava.util.HashMap;

  /**

  *

  *@ClassName:MessageUtil

  *@Description:消息处理类

  *@authormangues

  *@date--

  */

  publicclassMessageUtil{

  publicstaticHashMapgetMessage(CharBuffermsg){

  HashMapmap=newHashMap();

  StringmsgString=msg.toString();

  Stringm[]=msgString.split(",");

  map.put("fromName",m[]);

  map.put("toName",m[]);

  map.put("content",m[]);

  returnmap;

  }

  }

  5、web配置

  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">

  

  mywebsocket

  socket.MyWebSocketServlet

  

  mywebsocket

  *.do

  

  initServlet

  socket.InitServlet

  1

  

  index.jsp

6、前端,为方便起见,我直接用了两个jsp,在其中用<%session.setAttribute("user","小明")%>;来表示登录。

  两个jsp没任何本质差别,只是用来表示两个不同的人登录,可以同两个浏览器打开不同的jsp,来聊天操作

  A.小化

  <%@pagelanguage="java"contentType="text/html;charset=UTF-"

  pageEncoding="UTF-"%>

  

  Index

  

  <%session.setAttribute("user","小化");%>

  

  varws=null;

  functionstartWebSocket(){

  if('WebSocket'inwindow)

  ws=newWebSocket("ws://localhost:/webSocket/mywebsocket.do");

  elseif('MozWebSocket'inwindow)

  ws=newMozWebSocket("ws://localhost:/webSocket/mywebsocket.do");

  else

  alert("notsupport");

  ws.onmessage=function(evt){

  //alert(evt.data);

  console.log(evt);

  $("#xiaoxi").val(evt.data);

  };

  ws.onclose=function(evt){

  //alert("close");

  document.getElementById('denglu').innerHTML="离线";

  };

  ws.onopen=function(evt){

  //alert("open");

  document.getElementById('denglu').innerHTML="在线";

  document.getElementById('userName').innerHTML='小化';

  };

  }

  functionsendMsg(){

  varfromName="小化";

  vartoName=document.getElementById('name').value;//发给谁

  varcontent=document.getElementById('writeMsg').value;//发送内容

  ws.send(fromName+","+toName+","+content);

  }

  

  

聊天功能实现

  登录状态:

  正在登录

  登录人:

  

  发送给谁:

  发送内容:

  聊天框:

  

  B.小明

  <%@pagelanguage="java"contentType="text/html;charset=UTF-8"

  pageEncoding="UTF-8"%>

  

  Index

  

  <%session.setAttribute("user","小明");%>

  

  varws=null;

  functionstartWebSocket(){

  if('WebSocket'inwindow)

  ws=newWebSocket("ws://localhost:8080/webSocket/mywebsocket.do");

  elseif('MozWebSocket'inwindow)

  ws=newMozWebSocket("ws://localhost:8080/webSocket/mywebsocket.do");

  else

  alert("notsupport");

  ws.onmessage=function(evt){

  console.log(evt);

  //alert(evt.data);

  $("#xiaoxi").val(evt.data);

  };

  ws.onclose=function(evt){

  //alert("close");

  document.getElementById('denglu').innerHTML="离线";

  };

  ws.onopen=function(evt){

  //alert("open");

  document.getElementById('denglu').innerHTML="在线";

  document.getElementById('userName').innerHTML="小明";

  };

  }

  functionsendMsg(){

  varfromName="小明";

  vartoName=document.getElementById('name').value;//发给谁

  varcontent=document.getElementById('writeMsg').value;//发送内容

  ws.send(fromName+","+toName+","+content);

  }

  

  

聊天功能实现

  登录状态:

  正在登录

  登录人:

  

  发送给谁:

  发送内容:

  聊天框:

  

  以上所述是小编给大家介绍的使用JavaWebwebSocket实现简易的点对点聊天功能实例代码的相关知识,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。

相关文章

网友评论

    本文标题:解析使用JavaWeb webSocket实现简易的点对点聊天功

    本文链接:https://www.haomeiwen.com/subject/dbuqhftx.html