当前位置:懂科普 >

IT科技

> java comet

java comet

<link rel="stylesheet" href="https://js.how234.com/third-party/SyntaxHighlighter/shCoreDefault.css" type="text/css" /><script type="text/javascript" src="https://js.how234.com/third-party/SyntaxHighlighter/shCore.js"></script><script type="text/javascript"> SyntaxHighlighter.all(); </script>

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

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

Comet有以下两种实现方式:

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

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

java comet

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

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

前端页面:

<!DOCTYPE HTML><html><head><meta http-equiv="content-type" content="text/html;charset=utf-8"><script type="text/javascript">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;</script></head><body></body></html>

后台Servlet:

public class CometServlet extends HttpServlet {@Overridepublic 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<br>");}

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



标签: java comet
  • 文章版权属于文章作者所有,转载请注明 https://dongkepu.com/itkeji/golm0w.html