網站首頁 學習教育 IT科技 金融知識 旅遊規劃 生活小知識 家鄉美食 養生小知識 健身運動 美容百科 遊戲知識 綜合知識
當前位置:趣知科普吧 > IT科技 > 

comet|java

欄目: IT科技 / 發佈於: / 人氣:3.24W

<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再立即發出請求等待服務器的下次響應。 



Tags:comet java