前言
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
}
这个Servlet跟普通的Servlet有些不同,继承的WebSocketServlet类,并且要重写
createWebSocketInbound方法。这个类中Session中的user属性是用户进入index.jsp的时候设置的,记录当前用户的
昵称。下面就是自己实现的WebSocket连接对象类WebSocketMessageInbound类的代码:
-
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
}
前台展示
上面的代码就是聊天室后台的代码,主要是由3个对象组成,Servlet、连接对象、连接池,下面就是前台的代码,前台的代码主要是实现与服务器进行连
接,展示用户列表及信息列表,前台的展示使用了Ext框架,不熟悉Ext的同学可以初步的了解下Ext,下面的是index.jsp的代码:
-
<= = =%>
<
= (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的代码:
-
//用于展示用户的聊天信息
‘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版本都是带这个参数的,切记。
总结
实例下载
基于Tomcat7、Java、WebSocket的服务器推送聊天室 (转),布布扣,bubuko.com
基于Tomcat7、Java、WebSocket的服务器推送聊天室 (转)
原文:http://www.cnblogs.com/mrgong/p/3873717.html