前言
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:
- package import import import @WebServlet})
- //如果要接收浏览器的ws://协议的请求就必须实现WebSocketServlet这个类 publicclassextends privatestaticfinallong publicstaticint;
- public return);
- protected returnnewthis }
- package import import import import import import publicclassextends
- privatefinal public this public returnthis
- protectedvoid
- new , );
- , this
- new , );
- , WebSocketMessageInboundPool.getOnlineUser());
- this
- this
- protectedvoidint
- this new , );
- , this
- protectedvoidthrows thrownew
- protectedvoidthrows
- }
代码中的主要实现了onOpen、onClose、onTextMessage方法,分别处理用户上线、下线、发送消息。在这个类中有个 WebSocketMessageInboundPool连接池类,这个类是用来管理目前在线的用户的连接,下面是这个类的代码:
- package import import import import import publicclass
- privatestaticfinalnew
- publicstaticvoid
- publicstatic return publicstaticvoid
- publicstaticvoid try
- ifnull catch
- publicstaticvoid try for ifnull catch }
前台展示
- <= = =%> < = (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>
- //用于展示用户的聊天信息 ‘MessageContainer‘ ,
- true false ,
- ,
- ,
- ,
- ,
- ,
- ],
- function varthis , {
- ,
- , , , ]
- , {
- ,
- function varthis ] = Ext.Date.format(new]),
- );
- if ;
- else ;
- if });
- Ext.onReady(function
- var, {
- ,
- false false false function function iftrue
- var, {
- var, {
- ,
- ,
- ,
- var
- function if new));
- function
- );
- function
- );
- function
- );
- function var
- if) {
- elseif) {
- var function var ,
- true elseif) {
- var var var ,
- true elseif) {
- var var var,user);
- var, {
- ,
- false ,
- false true true true ,
- , {
- ,
- true var + user;
- var, {
- ,
- ,
- ,
- ,
- false function
- function var ifnull if new
- );
- 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项目的效果图: