基基于于Tomcat7、、Java、、WebSocket的的服服务务器器推推送送聊聊天天室室实实例例
前前言言
HT ML5 WebSocket实现了服务器与浏览器的双向通讯,双向通讯使服务器消息推送开发 加简单,最常见的就是即时通讯和对
信息实时性要求比较高的应用。以前的服务器消息推送大部分采用的都是“轮询”和“长连接”技术,这两中技术都会对服务器产生
相当大的开销,而且实时性不是特别高。WebSocket技术对只会产生很小的开销,并且实时性特别高。下面就开始讲解如何利用
WebSocket技术开发聊天室。在这个实例中,采用的是Tomcat7服务器,每个服务器对于WebSocket的实现都是不一样的,所以
这个实例只能在Tomcat服务器中运行,不过目前Spring 已经推出了WebSocket的A PI,能够兼容各个服务器的实现,大家可以查
阅相关的资料进行了解,在这里就不介绍了,下图是聊天室的效果图:
在这里实例中,实现了消息的实时推送,还实现了聊天用户的上下线通知。下面就开始具体讲解如何实现。
后后台台处处理理
Tomcat实现WebSocket的主要是依靠org.apache.catalina.web ocket.Me ageInbound这个类,这个类的在{TOMCA T_ HOME}/li
b/catalina.j ar中,所以你开发的时候需要将catalina.j ar和tomcat-coyote.j ar引入进来,下面这段代码就是暴露给客户端连接地址
的Servlet:
package com.ibcio;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import org.apache.catalina.websocket.StreamInbound;
WebServlet(urlPatterns = { "/message"})
//如果要接收浏览器的ws://协议的请求就必须实现WebSocketServlet这个类
public class WebSocketMessageServlet extends org.apache.catalina.websocket.WebSocketSer
vlet {
private static final long serialVersionUID = 1L;
public static int ONLINE_USER_COUNT = 1;
public String getUser(HttpServletRequest request){
return (String) request.getSession().getAttribute("user");
}
//跟平常Servlet不同的是,需要实现createWebSocketInbound,在这里初始化自定义的WebSocket连接
对象
Override
protected StreamInbound createWebSocketInbound(String subProtocol,HttpServletRequest
request) {
return new WebSocketMessageInbound(this.getUser(request));
}
}
这个Servlet跟普通的Servlet有些不同,继承的WebSocketServlet类,并且要重写createWebSocketInbound方法。这个类中Se io
n中的u er属性是用户进入index .j p的时候设置的,记录当前用户的昵称。下面就是自己实现的WebSocket连接对象类WebSocke
tMe ageInbound类的代码:
package com