Comet是最新的服务器push客户端技术,网友们一定听说过,即使没听说过,那Gmail Google talk
meebo也都体验过,这些就是使用的comet技术,使浏览器能在最短的延迟下获取新数据,并且不占很多带宽,comet就是long term
connection的意思,我写一个Comet最简单的教程:
1.最简单的长连接,实现长连接很简单,以jsp servlet为例,以下代码就能实现长连接
就是一个死循环,所以jsp结素不了,自然连接无法关闭
2.一个比较实用的comet
加入了打印时间,以及线程睡眠时间,降低cpu占用率,注意使用out.flush强制清cache,不然jsp会等程序结素后再写输出流,那样就看不到效果了,也什么都看不到,因为永远结素不了
3.客户端获取comet数据
这
是比较简单的一种,使用xmlhttp对象连接comet地址,在readystate为3时获取数据,并且此连接永远不结素,就是到状态4,但是这个
demo不可以在ie上面跑,因为ie对于iframe和xmlhttp的数据进行保护,在连接结束之前任何iframe内部的dom和xmlhttp的
responseText都是空,都是不可获得的,但是ie使用comet也不是没有办法,还是走以前serve
push老路子,iframe+script标记,script标记可以立即执行不等连接结素,代码:
while(true)
{
Date ttt= new java.util.Date();
out.println("");
out.flush();
Thread.sleep(2000);
}
function test(){
document.getElementById("aaa").src="login.jsp";
}
但
是还是有个小问题,这代码如果执行,开始10秒大概还是没反映,好似ie需要等待frame进行cache一下,但是10秒后,连续5个alert之后就
每隔2秒alert了,解决办法,在jsp前面写一些无意义文本呀,空格呀,就正常了,不知道是不是发送什么特殊header也可以,请知道的回答一下
吧,实际使用中把alert换成top.回调函数,里面的秒换成新的数据对象就可以了,格式可以是数组,字符串,对象,JSON什么都可以.
最
后,comet是可以大大降低延迟,降低带宽占用,但是也是有问题的,比如以这个例子:
1.如果关闭浏览器,你还是可以看到servlet还是在运行,循环还是在继续,无法停止,我也不知道怎么停止,请高人解答
2.无法跨域,无论基本的xmlhttp还是iframe的top回调都是无法跨域的,虽然iframe比xmlhttp要好,至少可以发出请求,但是由
于安全限制,不可以继续访问top资源,跨域还是script方法最好,但是没听说过script远程调用支持comet的,我也没试过,如果支持,那请
说明一下
我来说两句
内容:
验证:
发表评论
最新评论
查看全部评论……(共1条)