前言
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
- package
import
importimport
@WebServlet})
- //如果要接收浏览器的ws://协议的请求就必须实现WebSocketServlet这个类
publicclassextendsprivatestaticfinallong
publicstaticint;
- public
return); - protected
returnnewthis}
这个Servlet跟普通的Servlet有些不同,继承的WebSocketServlet类,并且要重写
createWebSocketInbound方法。这个类中Session中的user属性是用户进入index.jsp的时候设置的,记录当前用户的
昵称。下面就是自己实现的WebSocket连接对象类WebSocketMessageInbound类的代码:
[java] view
plaincopy
- package
import
import
importimport
import
importpublicclassextends
- privatefinal
public
thispublic
returnthis - protectedvoid
- new
, ); - , this
- new
, ); - , WebSocketMessageInboundPool.getOnlineUser());
- this
- this
- protectedvoidint
- this
new
, ); - , this
- protectedvoidthrows
thrownew - protectedvoidthrows
- }
代码中的主要实现了onOpen、onClose、onTextMessage方法,分别处理用户上线、下线、发送消息。在这个类中有个
WebSocketMessageInboundPool连接池类,这个类是用来管理目前在线的用户的连接,下面是这个类的代码:
[java] view
plaincopy
- package
import
import
import
import
importpublicclass
- privatestaticfinalnew
- publicstaticvoid
- publicstatic
returnpublicstaticvoid
- publicstaticvoid
try - ifnull
catch
- publicstaticvoid
tryfor
ifnull
catch
}
前台展示
上面的代码就是聊天室后台的代码,主要是由3个对象组成,Servlet、连接对象、连接池,下面就是前台的代码,前台的代码主要是实现与服务器进行连
接,展示用户列表及信息列表,前台的展示使用了Ext框架,不熟悉Ext的同学可以初步的了解下Ext,下面的是index.jsp的代码:
[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>
页面的展示主要是在websocket.js中进行控制,下面是websocket.jsd的代码:
[javascript] view
plaincopy
- //用于展示用户的聊天信息
‘MessageContainer‘,
- true
false
,
- ,
- ,
- ,
- ,
- ,
- ],
- function
varthis
, { - ,
- , , , ]
- , {
- ,
- function
varthis
] = Ext.Date.format(new]), - );
- if
; - else
; - if
});
这段代码主要是实现了展示消息的容器,下面就是页面加载完成后开始执行的代码:
[javascript] view
plaincopy
- Ext.onReady(function
- var, {
- ,
- false
false
falsefunction
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
ifnew
- );
- 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
基于Tomcat7、Java、WebSocket的服务器推送聊天室 (转),布布扣,bubuko.com