Comet push技术最根本的还是socket通信。它将客户端会话注册到一个map中,服务端通过客户端传入的JESSIONID来识别客户端,服务端不断给map中所有JESSIONID下的session注入数据。另一方面一旦有客户端链接,服务端就可以通过JESSIONID不断读session数据,然后发送给客户端。当然这种技术有缺陷,不适合高并发的访问。因为客户端和服务器端建立的是长连接,一旦连接过多服务端很难承受。
这里分服务端和客户端分别说明:
服务端
初始化阶段:
启动tomcat服务时,利用监听启动serversocket接口,并监听客户端请求 。同时还需启动一个session监听接口,当客户端访问时,session监听器通过sessionMap,将客户端发送关来的会话session中JSESSIONID作为sessionMap的key,session作为value.其中JSESSIONID是客户端的唯一标识。Sesssion监听程序大概如下:
public class CometSessionListener implements javax.servlet.http.HttpSessionListener{
public void sessionCreated(HttpSessionEvent event) {
SessionQueue.put(event.getSession().getId(), event.getSession());
}
public void sessionDestroyed(HttpSessionEvent event) {
System.out.println("sessionid="+event.getSession().getId());
SessionQueue.remove(event.getSession().getId());
}
}
数据推送到客户端阶段:
下面两个步骤是可以同时进行的
1.数据存放到sessionMap
sessionMap是保存发往每个客户端数据的容器。一旦服务端有新数据data,则将新数据data写入到每个客户端的session(即sessionMap.get(JSESSIONID))队列中。代码表示大概如下:
//获得sessionMap
LinkedHashMap sessions = SessionQueue.getSession(); Collection c = sessions.values();
Iterator iter = c.iterator();
while (iter.hasNext()) {
//通过循环获得每个session的值
HttpSession session = (HttpSession) iter.next();
PriorityQueue<Message> queue = (PriorityQueue<Message>) session
.getAttribute("message");
if (queue == null) {
queue = new PriorityQueue<Message>();
//将队列PriorityQueue赋值给session,session名为message
session.setAttribute("message", queue);
}
//将消息写入队列
queue.add(msg);
}
2.数据从sessionMap中取数据
当服务端socket监听到有客户端连接时,启动一个线程来处理,在此线程的run方法中,首先获取客户端http头部信息,解析出JESSIONID的值,然后通过死循环来不断取sessionMap中JESSSIONID下的消息,然后发送给客户端,当然发送给客户端之前的数据最终要转化为js,通过调用客户端js来改变html页面。代码表示大概如下:
HttpSession session = SessionQueue.get(getSid());
queue = (PriorityQueue<Message>) session
.getAttribute("message");
Message msg = null;
try {
msg = queue.remove();
} catch (Exception e) {
msg = null;
}
if (msg != null) {
OutputStream out = sc.getOutputStream();
out.write("HTTP/1.1 200 OK\r\n".getBytes());
out.write("Content-Type:text/html;charset=GBK\r\n\r\n".getBytes());
String content = "<script language='javascript'>window.parent.showMsg({user:'"
+ msg.getUser()
+ "',msg:'"
+ msg.getMsg() + "'});</script>";
out.write(content.getBytes());
out.flush();
}
1. 客户端
客户端就比较简单了,因为它是被动的,所以只要在页面初始化时发送一个http请求到服务端。建立socket连接就行了。然后就是页面上要有个js来改变页面的数据。代码大概如下:
<script>
var sId = getCookie("JSESSIONID");
window.onload = function(){
listener.action = listener.action + "&JSESSIONID="+sId;
listener.submit();
}
function showMsg(msg){
var msgDiv = document.createElement("div");
msgDiv.innerHTML = msg.user + " say: " + msg.msg;
document.all.info.appendChild(msgDiv);
}
function getCookie(sName){
var aCookie = document.cookie.split("; ");
for (var i=0; i < aCookie.length; i++){
var aCrumb = aCookie[i].split("=");
if (sName == aCrumb[0])
return unescape(aCrumb[1]);
}
return null;
}
</script>
<iframe name="result" width=0 height=0>
</iframe>
<iframe name="send">
</iframe>
<form method="post" name="listener" target="result"
action="http://localhost:81/index.jsp?callback=window.parent.showMsg">
</form>
注:在这学习的过程中是参照牛人hexiaodong的代码,其blog地址http://hexiaodong.iteye.com/
分享到:
相关推荐
http长连接comet pushlet 例子 导入eclipse 直接能用
comet框架例子项目,自己写的一个参考例子供大家学习
tomcat实现comet例子,实现后台产生每隔几秒产生随机数,前台不刷新显示。tomcat实现comet例子,实现后台产生每隔几秒产生随机数,前台不刷新显示。tomcat实现comet例子,实现后台产生每隔几秒产生随机数,前台不...
Comet 有时也称反向 Ajax 或服务器端推技术(server-side push)。其思想很简单:将数据直接从服务器推到浏览器,而不必等到浏览器请求数据。听起来简单,但是如果熟悉 Web 应用程序,尤其是 HTTP 协议,那么您就会...
demo是采用comet的web推送技术,使用tomcat7做服务器,内含tomcat7上面配置说明,在MyEclipse、tomcat7上面完美运行,本人亲测!
通过tomcat服务器,向网页发送即时消息。comet的小例子,可以直接运行,用tomcat6.0。
asp.net comet例子,基于ajax的长联技术, 注:此版本只有ff下正常 ie下可以用iframe实现 http://www.dotnetdev.cn
comet4j,comet4j实例,实例代码,可直接运行
comet4j完整包、comet4j.js、comet4j-tomcat6.jar、comet4j-tomcat7.jar
pushlet 和comet 资料介绍 介绍如何从服器端push subscrite 给浏览器
comet4j消息推送所需的comet4j-tomcat7.jar包,comet4j-tomcat7.jar
comet4j-tomcat7.jar comet4j.js Comet4J(Comet for Java)是一个纯粹基于AJAX(XMLHTTPRequest)的服务器推送框架
一个comet的实例,使用了dojoJavaScript等
java-comet
comet4j-tomcat6、comet4j-tomcat7 的jar包和comet4j.js资源下载
ssh框架整合comet实现即时通信的简单实例,ssh框架整合comet实现即时通信的简单实例
包含comet4j-tomcat6.jar,comet4j-tomcat7.jar,comet4j.js,以及官网demo:comet4j-tomcat6-demo.war
Comet4J(Comet for Java)是一个纯粹基于AJAX(XMLHTTPRequest)的服务器推送框架,消息以JSON方式传递,具备长轮询、长连接、自动选择三种工作模式 文件包含comet4j-tomcat6.jar , comet4j-tomcat7.jar , comet4j.js...
comet4j开发指南 Comet4J(Comet for Java)是一个纯粹基于AJAX(XMLHTTPRequest)的服务器推送框架
comet4j消息推送所需的comet4j.js文件、comet4j-tomcat6.jar、comet4j-tomcat7.jar包