首页 > 代码库 > 基于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
 
  1. packageimportimportimport@WebServlet})  
  2. //如果要接收浏览器的ws://协议的请求就必须实现WebSocketServlet这个类publicclassextendsprivatestaticfinallongpublicstaticint;  
  3. publicreturn);  
  4.   
  5.   
  6. protectedreturnnewthis}  
        这个Servlet跟普通的Servlet有些不同,继承的WebSocketServlet类,并且要重写createWebSocketInbound方法。这个类中Session中的user属性是用户进入index.jsp的时候设置的,记录当前用户的昵称。下面就是自己实现的WebSocket连接对象类WebSocketMessageInbound类的代码:
[java] view plaincopy
 
  1. packageimportimportimportimportimportimportpublicclassextends  
  2. privatefinalpublicthispublicreturnthis  
  3.   
  4. protectedvoid  
  5. new);  
  6. this  
  7. new);  
  8. , WebSocketMessageInboundPool.getOnlineUser());  
  9.   
  10. this  
  11. this  
  12. protectedvoidint  
  13. thisnew);  
  14. this  
  15.   
  16. protectedvoidthrowsthrownew  
  17.   
  18. protectedvoidthrows  
  19. }  

     代码中的主要实现了onOpen、onClose、onTextMessage方法,分别处理用户上线、下线、发送消息。在这个类中有个WebSocketMessageInboundPool连接池类,这个类是用来管理目前在线的用户的连接,下面是这个类的代码:
[java] view plaincopy
 
  1. packageimportimportimportimportimportpublicclass  
  2. privatestaticfinalnew  
  3. publicstaticvoid  
  4.   
  5. publicstaticreturnpublicstaticvoid  
  6. publicstaticvoidtry  
  7. ifnullcatch  
  8. publicstaticvoidtryforifnullcatch}  

前台展示


    上面的代码就是聊天室后台的代码,主要是由3个对象组成,Servlet、连接对象、连接池,下面就是前台的代码,前台的代码主要是实现与服务器进行连接,展示用户列表及信息列表,前台的展示使用了Ext框架,不熟悉Ext的同学可以初步的了解下Ext,下面的是index.jsp的代码:
[html] view plaincopy
 
  1. <= = =%>< = (String)session.getAttribute("user");  
  2.  == null){  
  3.  =  + WebSocketMessageServlet.ONLINE_USER_COUNT;  
  4. ><html><head><title></title>  
  5. <link= = =><link= = = /><link= = = />  
  6. <script= =></script><script= =></script><script=> = ;  
  7. </script></head><body><h1></h1><p></p><ul= =><li></li><li></li><li></li><li></li></ul><div=></div></body></html>  
       页面的展示主要是在websocket.js中进行控制,下面是websocket.jsd的代码:

[javascript] view plaincopy
 
  1. //用于展示用户的聊天信息‘MessageContainer‘,  
  2. truefalse,  
  3. ,  
  4. ,  
  5. ,  
  6. ,  
  7.   
  8. ,  
  9. ],  
  10. functionvarthis, {  
  11. ,  
  12. ]  
  13. , {  
  14. ,  
  15.   
  16. functionvarthis] = Ext.Date.format(new]),  
  17. );  
  18. if;  
  19. else;  
  20. if});  
      这段代码主要是实现了展示消息的容器,下面就是页面加载完成后开始执行的代码:

[javascript] view plaincopy
 
  1. Ext.onReady(function  
  2. var, {  
  3. ,  
  4. falsefalsefalsefunctionfunctioniftrue  
  5. var, {  
  6.   
  7. var, {  
  8. ,  
  9. ,  
  10. ,  
  11. var  
  12. functionifnew));  
  13. function  
  14. );  
  15. function  
  16. );  
  17. function  
  18. );  
  19.   
  20. functionvar  
  21. if) {  
  22. elseif) {  
  23.   
  24. varfunctionvar,  
  25. trueelseif) {  
  26.   
  27. varvarvar,  
  28. trueelseif) {  
  29.   
  30. varvarvar,user);  
  31.   
  32. var, {  
  33. ,  
  34. false,  
  35. falsetruetruetrue,  
  36. , {  
  37. ,  
  38. truevar + user;  
  39.   
  40. var, {  
  41. ,  
  42. ,  
  43. ,  
  44. ,  
  45. falsefunction  
  46. functionvarifnullifnew  
  47.   
  48. );  
  49. else);  
  50.         });  
      上面的代码就是页面完成加载后自动连接服务器,并创建展示界面的代码。

注意


        需要注意的两点,在部署完成之后需要将在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