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

1、InitServlet
该类主要是用来初始化构造将来存储用户身份信息的map仓库,利用其初始化方法Init初始化仓库,利用其静态方法getSocketList获得对应的用户身份信息。
webSocket,我认为MessageInbound用来识别登录人的信息,用它来找到对应的人,推送消息。每次登录都会产生一个MessageInbound。
这里的HashMap<String,MessageInbound>: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;
//privatestaticList<MessageInbound>socketList;
privatestaticHashMap<String,MessageInbound>socketList;
publicvoidinit(ServletConfigconfig)throwsServletException{
//InitServlet.socketList=newArrayList<MessageInbound>();
InitServlet.socketList=newHashMap<String,MessageInbound>();
super.init(config);
System.out.println("Serverstart============");
}
publicstaticHashMap<String,MessageInbound>getSocketList(){
returnInitServlet.socketList;
}
/*publicstaticList<MessageInbound>getSocketList(){
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
HashMap<String,String>messageMap=MessageUtil.getMessage(msg);//处理消息类
//上线用户集合类map
HashMap<String,MessageInbound>userMsgMap=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{
publicstaticHashMap<String,String>getMessage(CharBuffermsg){
HashMap<String,String>map=newHashMap<String,String>();
StringmsgString=msg.toString();
Stringm[]=msgString.split(",");
map.put("fromName",m[]);
map.put("toName",m[]);
map.put("content",m[]);
returnmap;
}
}
5、web配置
<?xmlversion="1.0"encoding="UTF-8"?> <web-appversion="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>mywebsocket</servlet-name> <servlet-class>socket.MyWebSocketServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>mywebsocket</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>
6、前端,为方便起见,我直接用了两个jsp,在其中用<%session.setAttribute("user","小明")%>;来表示登录。
两个jsp没任何本质差别,只是用来表示两个不同的人登录,可以同两个浏览器打开不同的jsp,来聊天操作
A.小化
<%@pagelanguage="java"contentType="text/html;charset=UTF-"
pageEncoding="UTF-"%>
<!DOCTYPEhtml>
<html>
<head>
<metahttp-equiv="Content-Type"content="text/html;charset=UTF-">
<title>Index</title>
<scripttype="text/javascript"src="js/jquery...min.js"></script>
<%session.setAttribute("user","小化");%>
<scripttype="text/javascript">
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);
}
</script>
</head>
<bodyonload="startWebSocket();">
<p>聊天功能实现</p>
登录状态:
<spanid="denglu"style="color:red;">正在登录</span>
<br>
登录人:
<spanid="userName"></span>
<br>
<br>
<br>
发送给谁:<inputtype="text"id="name"value="小明"></input>
<br>
发送内容:<inputtype="text"id="writeMsg"></input>
<br>
聊天框:<textarearows=""cols=""readonlyid="xiaoxi"></textarea>
<br>
<inputtype="button"value="send"onclick="sendMsg()"></input>
</body>
</html>
B.小明
<%@pagelanguage="java"contentType="text/html;charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPEhtml>
<html>
<head>
<metahttp-equiv="Content-Type"content="text/html;charset=UTF-8">
<title>Index</title>
<scripttype="text/javascript"src="js/jquery2.1.1.min.js"></script>
<%session.setAttribute("user","小明");%>
<scripttype="text/javascript">
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);
}
</script>
</head>
<bodyonload="startWebSocket();">
<p>聊天功能实现</p>
登录状态:
<spanid="denglu"style="color:red;">正在登录</span>
<br>
登录人:
<spanid="userName"></span>
<br>
<br>
<br>
发送给谁:<inputtype="text"id="name"value="小化"></input>
<br>
发送内容:<inputtype="text"id="writeMsg"></input>
<br>
聊天框:<textarearows="13"cols="100"readonlyid="xiaoxi"></textarea>
<br>
<inputtype="button"value="send"onclick="sendMsg()"></input>
</body>
</html>以上所述是小编给大家介绍的使用JavaWebwebSocket实现简易的点对点聊天功能实例代码的相关知识,希望对大家有所帮助,最后想要了解更多Java信息的同学可以前往扣丁学堂官网咨询,扣丁学堂Java培训深受学员的喜爱。扣丁学堂不仅有专业的老师和与时俱进的课程体系,还有大量的Java视频教程供学员观看学习哦。扣丁学堂java技术交流群:487098661。
我要赚赏金
