首页 > 代码库 > 基于Tomcat7、Java、WebSocket的服务器推送聊天室 (转)
基于Tomcat7、Java、WebSocket的服务器推送聊天室 (转)
前言
HTML5 WebSocket实现了服务器与浏览器的双向通讯,双向通讯使服务器消息推送开发更加简单,最常见的就是即时通讯和对信息实时性要求比较高的应用。以前的服务器消息推送大部分采用的都是“轮询”和“长连接”技术,这两中技术都会对服务器产生相当大的开销,而且实时性不是特别高。WebSocket技术对只会产生很小的开销,并且实时性特别高。下面就开始讲解如何利用WebSocket技术开发聊天室。在这个实例中,采用的是Tomcat7服务器,每个服务器对于WebSocket的实现都是不一样的,所以这个实例只能在Tomcat服务器中运行,不过目前Spring已经推出了WebSocket的API,能够兼容各个服务器的实现,大家可以查阅相关的资料进行了解,在这里就不介绍了,下图是聊天室的效果图:
在这里实例中,实现了消息的实时推送,还实现了聊天用户的上下线通知。下面就开始具体讲解如何实现。
后台处理
Tomcat实现WebSocket的主要是依靠org.apache.catalina.websocket.MessageInbound这个类,这个类的在{TOMCAT_HOME}/lib/catalina.jar中,所以你开发的时候需要将catalina.jar和tomcat-coyote.jar引入进来,下面这段代码就是暴露给客户端连接地址的Servlet:
[java] view plaincopy
- packageimportimportimport@WebServlet})
- //如果要接收浏览器的ws://协议的请求就必须实现WebSocketServlet这个类publicclassextendsprivatestaticfinallongpublicstaticint;
- publicreturn);
- protectedreturnnewthis}
[java] view plaincopy
- packageimportimportimportimportimportimportpublicclassextends
- privatefinalpublicthispublicreturnthis
- protectedvoid
- new, );
- , this
- new, );
- , WebSocketMessageInboundPool.getOnlineUser());
- this
- this
- protectedvoidint
- thisnew, );
- , this
- protectedvoidthrowsthrownew
- protectedvoidthrows
- }
代码中的主要实现了onOpen、onClose、onTextMessage方法,分别处理用户上线、下线、发送消息。在这个类中有个WebSocketMessageInboundPool连接池类,这个类是用来管理目前在线的用户的连接,下面是这个类的代码:
[java] view plaincopy
- packageimportimportimportimportimportpublicclass
- privatestaticfinalnew
- publicstaticvoid
- publicstaticreturnpublicstaticvoid
- publicstaticvoidtry
- ifnullcatch
- publicstaticvoidtryforifnullcatch}
前台展示
[html] view plaincopy
- <= = =%>< = (String)session.getAttribute("user");
- == null){
- = + WebSocketMessageServlet.ONLINE_USER_COUNT;
- ><html><head><title></title>
- <link= = =><link= = = /><link= = = />
- <script= =></script><script= =></script><script=> = ;
- </script></head><body><h1></h1><p></p><ul= =><li></li><li></li><li></li><li></li></ul><div=></div></body></html>
[javascript] view plaincopy
- //用于展示用户的聊天信息‘MessageContainer‘,
- truefalse,
- ,
- ,
- ,
- ,
- ,
- ],
- functionvarthis, {
- ,
- , , , ]
- , {
- ,
- functionvarthis] = Ext.Date.format(new]),
- );
- if;
- else;
- if});
[javascript] view plaincopy
- Ext.onReady(function
- var, {
- ,
- falsefalsefalsefunctionfunctioniftrue
- var, {
- var, {
- ,
- ,
- ,
- var
- functionifnew));
- function
- );
- function
- );
- function
- );
- functionvar
- if) {
- elseif) {
- varfunctionvar,
- trueelseif) {
- varvarvar,
- trueelseif) {
- varvarvar,user);
- var, {
- ,
- false,
- falsetruetruetrue,
- , {
- ,
- truevar + user;
- var, {
- ,
- ,
- ,
- ,
- falsefunction
- functionvarifnullifnew
- );
- else, );
- });
注意
需要注意的两点,在部署完成之后需要将在tomcat应用目录中的lib目录下的catalina.jar和tomcat-coyote.jar删掉,比如项目的lib目录在D:\workspace\WebSocket\WebRoot\WEB-INF\lib,而部署的应用lib目录是在D:\tools\apache-tomcat-7.0.32\webapps\WebSocket\WEB-INF\lib,删掉部署目录的lib目录中连两个jar就可以了,否则会包Could not initialize class com.ibcio.WebSocketMessageServlet错误,切记。
如果还是无法建立连接,请下载最新的tomcat,忘了是那个版本的tomcatcreateWebSocketInbound是没有request参数的,现在的这个代码是有这个参数了,7.0.3XX版本都是带这个参数的,切记。
总结
使用WebSocket开发服务器推送非常方便,这个是个简单的应用,其实还可以结合WebRTC实现视频聊天和语音聊天。在我的Leetop项目中已经实现了浏览器端视频聊天的功能,大家可以去看看 www.ibcio.com,在我的另外一篇文章中有详细的介绍:http://blog.csdn.net/leecho571/article/details/8207102,下图就是Leetop项目的效果图:
实例下载
下载地址:http://download.csdn.net/detail/leecho571/5854569
本文转自:http://blog.csdn.net/leecho571/article/details/9707497
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。