java comet

作者:原创时间:2022-03-25
文档

java comet是什么,让我们一起了解一下?

comet是基于HTTP长连接的“服务器推”技术,是一种新的Web应用架构。基于Java的成熟的服务器推送框架有 DWR ,另外comet的应用主要体现在股票系统和实时通讯。

Comet有以下两种实现方式:

1、长轮询(long-polling):用JS发送Ajax请求,但是服务器不会立马响应,直到服务器有消息给客户端时再响应,响应完成后连接关闭,客户端立即再次发送请求,等待响应。

2、流(streaming):和上面long-polling不同的是,服务器发完消息后,不会关闭连接,而是保持HTTP连接继续等待下一条消息。这样客户端不用每次收到消息连接关闭后再次请求。

这种方式的原理是HTTP协议响应头的一个Header:Transfer-Encoding: chunked。普通的HTTP响应头中会有Content-Length表示整个响应的字节大小,浏览器接收到所有的响应数据才会加载内容。而设置Transfer-Encoding: chunked后表示响应大小不固定,浏览器接收到一点响应数据就加载一点。基于流的Comet后台实现是一样的,但是前端会有几种不同的方式:iframe流和针对FireFox的方式。

那么实际操作中,Comet是如何实现的?(以长轮询为例)

前端页面:






function getMsg() {
// 请求地址是CometServlet对应的URL,加上一个随机值参数防止缓存问题
var url = "comet" + "?t="+Math.random();
var request = new XMLHttpRequest();
request.onreadystatechange = function() {
if (request.readyState == 4) {
if (request.status == 200) {
if (request.responseText) {
// 追加到HTML中
document.body.innerHTML += request.responseText;
}
}
// Ajax完成后,再次Ajax请求
getMsg();
}
};
request.open("GET", url, true);
request.send();
}
window.onload = getMsg;




后台Servlet:

public class CometServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 这里用Thread.sleep来模拟comet,相当于每隔5秒服务器向客户端推送一条消息
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
PrintWriter out = response.getWriter();
out.println("helloworld
"); }

在浏览器中打开html页面,可以看到每隔5秒服务器向客户端推送一个helloworld字符串。而接收到字符串HTTP连接就断开了,然后Ajax再立即发出请求等待服务器的下次响应。 

以上就是小编今天的分享了,希望可以帮助到大家。



显示全文
山楂干泡水最佳搭配 java commandline java comparable接口 java compiler java config java console java console.log 复活节的由来 java const java consumer接口 统一和康师傅是哪国的 怎么删掉word中的空白页 微信笔记在哪里编辑 椰子怎么挑 蟑螂最怕三种克星 毛尖属于什么茶 微信铃声怎么设置自己的歌 怎么确认微信还在不在电脑端 河南过年的风俗有哪些 丽水市是哪个省 java combobox java color java collections java collect java clone() java clob java classloader java class.forname java class java cipher java charset java charsequence java charat java channel iPad怎么重启 java cglib 平板如何录屏 java ceiling java callback java calendar获取当前时间