HTTP 是客戶端-服務(wù)器計算模型中的請求-響應(yīng)協(xié)議。要開始交換,客戶端向服務(wù)器提交請求。為了完成交換,服務(wù)器向客戶端返回響應(yīng)。服務(wù)器只能向一個客戶端發(fā)送響應(yīng) (發(fā)出請求的那個) 。在 HTTP 協(xié)議中,客戶端是消息交換的發(fā)起者。

創(chuàng)新互聯(lián)是一家專業(yè)提供劍河企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、html5、小程序制作等業(yè)務(wù)。10年已為劍河眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進行中。
服務(wù)器發(fā)送事件 (SSE) 是一種簡單的技術(shù),用于為特定的 Web 應(yīng)用程序?qū)崿F(xiàn)服務(wù)器到客戶端的異步通信。
有多種技術(shù)允許客戶端從服務(wù)器接收有關(guān)異步更新的消息。它們可以分為兩類: 客戶端拉取 和 服務(wù)器推送 。
在客戶端拉取技術(shù)中,客戶端會定期向服務(wù)器請求更新。服務(wù)器可以使用更新或尚未更新的特殊響應(yīng)進行響應(yīng)。有兩種類型的客戶端拉取:短輪詢和長輪詢。
客戶端定期向服務(wù)器發(fā)送請求。如果服務(wù)器有更新,它會向客戶端發(fā)送響應(yīng)并關(guān)閉連接。如果服務(wù)器沒有更新,它也會向客戶端發(fā)送一個響應(yīng)并關(guān)閉連接。
客戶端向服務(wù)器發(fā)送請求。如果服務(wù)器有更新,它會向客戶端發(fā)送響應(yīng)并關(guān)閉連接。如果服務(wù)器沒有更新,它會保持連接直到更新可用。當(dāng)更新可用時,服務(wù)器向客戶端發(fā)送響應(yīng)并關(guān)閉連接。如果更新在某個超時時間內(nèi)不可用,服務(wù)器會向客戶端發(fā)送響應(yīng)并關(guān)閉連接。
在服務(wù)器推送技術(shù)中,服務(wù)器在消息可用后立即主動向客戶端發(fā)送消息。其中,有兩種類型的服務(wù)器推送:SSE和 WebSocket。
SSE 是一種在基于瀏覽器的 Web 應(yīng)用程序中僅從服務(wù)器向客戶端發(fā)送文本消息的技術(shù)。SSE基于 HTTP 協(xié)議中的持久連接, 具有由 W3C 標(biāo)準(zhǔn)化的網(wǎng)絡(luò)協(xié)議和 EventSource 客戶端接口,作為 HTML5 標(biāo)準(zhǔn)套件的一部分。
WebSocket 是一種在 Web 應(yīng)用程序中實現(xiàn)同時、雙向、實時通信的技術(shù)。WebSocket 基于 HTTP 以外的協(xié)議(TCP),因此可能需要額外設(shè)置網(wǎng)絡(luò)基礎(chǔ)設(shè)施(代理服務(wù)器、NAT、防火墻等)。
客戶端通過Http協(xié)議請求,在握手階段升級為WebSocket協(xié)議。
在數(shù)據(jù)字段中,服務(wù)器可以發(fā)送事件數(shù)據(jù)
服務(wù)器可以發(fā)送唯一的事件標(biāo)識符(id字段)。如果連接中斷,客戶端會 自動重新連接 并發(fā)送最后接收到的帶有header的 Last-Event-ID 的事件 ID。
在重試字段中,服務(wù)器可以發(fā)送超時(以毫秒為單位),之后客戶端應(yīng)在連接中斷時自動重新連接。如果未指定此字段,則標(biāo)準(zhǔn)應(yīng)為 3000 毫秒。
如果一行以冒號字符 : 開頭,客戶端應(yīng)該忽略它。這可用于從服務(wù)器發(fā)送評論或防止某些代理服務(wù)器因超時關(guān)閉連接。
要打開連接,應(yīng)創(chuàng)建一個 EventSource 對象。
盡管 SSE 旨在將事件從服務(wù)器發(fā)送到客戶端,但可以使用 GET 查詢參數(shù)將數(shù)據(jù)從客戶端傳遞到服務(wù)器。
要關(guān)閉連接,應(yīng)調(diào)用方法 close()。
有表示連接狀態(tài)的 readyState 屬性:
客戶端接收消息并處理他們,可以使用onmessage方法
SSE可被大多數(shù)瀏覽器支持:
Spring Web MVC 框架 5.2.0 是基于 Servlet 3.1 API 且用線程池實現(xiàn)異步應(yīng)用程序. 所以應(yīng)用能夠被使用在 Servlet 3.1+ 的容器,比如:Tomcat 8.5 和 Jetty 9.3.
使用Spring MVC來發(fā)送事件:
示例:
在這個例子中,服務(wù)器每秒發(fā)送一個持續(xù)時間短的周期性事件流 - 一個有限的詞流,直到詞完成。
示例:
運行效果:
客戶端示例(words.html):
運行效果:
在此示例中,服務(wù)器發(fā)送持久的周期性事件流 - 每秒可能無限的服務(wù)器性能信息流:
效果預(yù)覽(每秒輸出一次):
非周期性是指沒有固定的時間周期,可能由其他因素在任意時刻都可能觸發(fā),下面示例通過spring event來模擬觸發(fā)因子。
效果:
模擬觸發(fā)動作:調(diào)用
客戶端收到數(shù)據(jù):
Spring Web Flux 框架 5.2.0 是基于 Reactive Streams API 且使用 event-loop 計算模型來實現(xiàn)異步j(luò)ava應(yīng)用程序。 此類應(yīng)用程序可以在非阻塞 Web 服務(wù)器(例如 Netty 4.1 和 Undertow 1.4)和 Servlet 3.1+ 容器(例如 Tomcat 8.5 和 Jetty 9.3)上運行。
使用 Spring Web Flux 框架實現(xiàn)發(fā)送事件:
簡單示例:
和上面spring mvc的示例一樣,也是每秒輸出數(shù)據(jù),實現(xiàn)如下:
效果:
對比spring mvc的實現(xiàn),我們改為flux實現(xiàn),如下:
效果和上面是一樣的,可以看出,reactive api是非常的簡潔。
HTML5有一個Server-Sent Events(SSE)功能,允許服務(wù)端推送數(shù)據(jù)到客戶端。(通常叫數(shù)據(jù)推送)。我們來看下,傳統(tǒng)的WEB應(yīng)用程序通信時的簡單時序圖:
sse1
現(xiàn)在Web App中,大都有Ajax,是這樣子:
sse2
基于數(shù)據(jù)推送是這樣的,當(dāng)數(shù)據(jù)源有新數(shù)據(jù),它馬上發(fā)送到客戶端,不需要等待客戶端請求。這些新數(shù)據(jù)可能是最新聞,最新股票行情,來自朋友的聊天信息,天氣預(yù)報等。
sse3
數(shù)據(jù)拉與推的功能是一樣的,用戶拿到新數(shù)據(jù)。但數(shù)據(jù)推送有一些優(yōu)勢。 你可能聽說過Comet, Ajax推送, 反向Ajax, HTTP流,WebSockets與SSE是不同的技術(shù)。可能最大的優(yōu)勢是低延遲。SSE用于web應(yīng)用程序刷新數(shù)據(jù),不需要用戶做任何動作。
你可能聽說過HTML5的WebSockets,也能推送數(shù)據(jù)到客戶端。WebSockets是實現(xiàn)服務(wù)端更加復(fù)雜的技術(shù),但它是真的全雙工socket, 服務(wù)端能推送數(shù)據(jù)到客戶端,客戶端也能推送數(shù)據(jù)回服務(wù)端。SSE工作于存在HTTP/HTTPS協(xié)議,支持代理服務(wù)器與認證技術(shù)。SSE是文本協(xié)議你能輕易的調(diào)試它。如果你需要發(fā)送大部二進制數(shù)據(jù)從服務(wù)端到客戶端,WebSocket是更好的選擇。
讓我們來看一下很簡單示例,先是前端basic_sse.html:
!doctype html
html
head
meta charset="UTF-8"
titleBasic SSE Example/title
/head
body
pre id="x"Initializing.../pre
script
var es = new EventSource("basic_sse.php");
es.addEventListener("message", function(e){
document.getElementById("x").innerHTML += "\n" + e.data;
},false);
/script
/body
/html
后端先是一個basic_sse.php頁面:
?php
header("Content-Type: text/event-stream");
while(true){
echo "data:".date("Y-m-d H:i:s")."\n\n";
@ob_flush();@flush();
sleep(1);
}
?
您可以使用Apache Server 這里我們把它們放在SinaAppEngine上,瀏覽器FireFox訪問basic_see.html時,將繼續(xù)返回當(dāng)前時間:
sse4
代碼中數(shù)據(jù)格式是data: datetime. 在這兒,我們還可以使用Node.js來做服務(wù)端,datepush.js代碼是這樣的:
var http = require("http");
http.createServer(function(request, response){
response.writeHead(200, { "Content-Type": "text/event-stream" });
setInterval(function(){
var content = "data:" +
new Date().toISOString() + "\n\n";
response.write(content);
}, 1000);
}).listen(1234);
完善一下功能,如果我們用Node.js來返回HTML,代碼是這樣的datepush.js:
var http = require("http"), fs = require("fs");
var port = parseInt( process.argv[2] || 1234 );
http.createServer(function(request, response){
console.log("Client connected:" + request.url);
if(request.url!="/sse"){
fs.readFile("basic_sse.html", function(err,file){
response.writeHead(200, { 'Content-Type': 'text/html' });
var s = file.toString(); //file is a buffer
s = s.replace("basic_sse.php","sse");
response.end(s);
});
return;
}
//Below is to handle SSE request. It never returns.
response.writeHead(200, { "Content-Type": "text/event-stream" });
var timer = setInterval(function(){
var content = "data:" + new Date().toISOString() + "\n\n";
var b = response.write(content);
if(!b)console.log("Data got queued in memory (content=" + content + ")");
else console.log("Flushed! (content=" + content + ")");
},1000);
request.connection.on("close", function(){
response.end();
clearInterval(timer);
console.log("Client closed connection. Aborting.");
});
}).listen(port);
console.log("Server running at :" + port);
在一對一直播交友源碼的開發(fā)過程中,即時通訊是最關(guān)鍵的功能之一。那一對一直播源碼系統(tǒng)是如何實現(xiàn)即時通訊的呢?
即時通訊就是實時語音文字視頻等交流,實現(xiàn)即時通訊目前有四種方式:短輪詢、長輪詢、SSE、websocket,接下來我們來按順序簡單了解一下。
(1)短輪詢
即每隔一小段時間就發(fā)送一個請求到服務(wù)器,服務(wù)器返回最新數(shù)據(jù)然后客戶端根據(jù)獲得的數(shù)據(jù)來更新界面,這樣就間接地實現(xiàn)了即時通信。這一方式的優(yōu)點是簡單,缺點是對服務(wù)器的壓力較大,浪費帶寬的流量,但通常情況下數(shù)據(jù)都是沒有發(fā)生改變的。
(2)長輪詢
即客戶端發(fā)送一個請求到服務(wù)器,然后服務(wù)器查看客戶端請求的數(shù)據(jù)(就是服務(wù)器中的數(shù)據(jù))是否發(fā)生變化,如果發(fā)生變化,就會立即響應(yīng)返回,否則保持這個鏈接并定期檢查最新數(shù)據(jù),直到發(fā)生了數(shù)據(jù)更新或者連接超時。因此,客戶端連接一旦斷開,就會再次發(fā)出請求,這樣一來,在相同的時間內(nèi)大大減少了客戶端請求服務(wù)器的次數(shù)。這一方式有一個弊端:服務(wù)器長時間的連接會消耗資源,返回數(shù)據(jù)的順序無法保證,管理和維護困難。
(3)SSE
即服務(wù)器推送事件,為了解決瀏覽器只能夠單向傳輸數(shù)據(jù)到服務(wù)端,HTML5提供了一種新的技術(shù)叫做服務(wù)器推送事件SSE。SSE技術(shù)提供的是從服務(wù)器單向推送數(shù)據(jù)給瀏覽器的功能,但是配合瀏覽器主動請求,實際上就是實現(xiàn)客戶端與服務(wù)器之間的雙向通信。
(4)Websocket
在HTML5中,為了加強web的功能,提供了websocket技術(shù),它不僅是一種web通信方式,也是一種應(yīng)用層協(xié)議。它提供了瀏覽器和服務(wù)器之間原生的全雙工跨域通信。通過瀏覽器和服務(wù)器之間所建立的websocket連接,在同一時刻能夠?qū)崿F(xiàn)客戶端到服務(wù)器和服務(wù)器到客戶端的數(shù)據(jù)發(fā)送。
數(shù)據(jù)推送是云計算的特點。
云計算的數(shù)據(jù)推送方法、裝置、電子設(shè)備及系統(tǒng)時。應(yīng)用本申請方案,能夠在用戶行為數(shù)據(jù)的第一特征向量的基礎(chǔ)上進一步挖掘額外的特征維度,提高對用戶行為數(shù)據(jù)的特征分析的效率和全面性,避免遺漏特征維度。
這樣,能夠準(zhǔn)確、完整地確定出用戶行為數(shù)據(jù)對應(yīng)的目標(biāo)特征向量,然后基于該目標(biāo)特征向量準(zhǔn)確地確定期望數(shù)據(jù)并進行推送,進而提高云端服務(wù)器在數(shù)據(jù)推送過程中的推送準(zhǔn)確性,避免數(shù)據(jù)的誤推送。
數(shù)據(jù)推送介紹
如今,數(shù)據(jù)推送技術(shù)在網(wǎng)站和Web應(yīng)用中得到了廣泛應(yīng)用,比如在拍賣網(wǎng)絡(luò)應(yīng)用中推送出價,在售書網(wǎng)站推送新評論,在在線游戲中推送新高分,推送用戶感興趣的微博,等等。
本書是一本簡明的數(shù)據(jù)推送技術(shù)指南,作者通過構(gòu)建一個真實的例子,手把手地向讀者展示如何利用HTML5 SSE(Server-Sent Events,服務(wù)端推送事件)這項非凡的技術(shù),無需輪詢或者用戶交互,就可以將數(shù)據(jù)從服務(wù)器端推送到客戶端。
HTTP長連接
HTTP1.1協(xié)議具備的,TCP連接一直不斷保持著,Connection:keep-alive頭來驗證是否支持。
Web交互方式
普通輪詢:普通的前后端通信方式,請求中多半無用,可以使用HTTP長連接技術(shù);可以使用AJAX(XMLHttpRequest類),也可以使用ifram方式請求;實時性差。
長輪詢:對于有實時性要求的場景(其實在兩次連接之間,還是會有實時性問題),客戶端發(fā)送請求后,后端hold住,有數(shù)據(jù)時才返回,客戶端收到后斷開,再啟用新的請求進行連接,通過這樣的方式模擬服務(wù)端推送。節(jié)省了反復(fù)建立連接的開銷,但是服務(wù)器端會一直while保持著連接消耗資源,服務(wù)器端需要設(shè)置好超時時間(set_time_limit),有數(shù)據(jù)時返回(flushob_flush)超時時間內(nèi)如果沒有數(shù)據(jù)返回,則需要跳出斷開連接,以免死循環(huán)。這種模式被稱為反向AJAX/Comet,由服務(wù)器端進行數(shù)據(jù)實時推送。問題是:服務(wù)端開銷依然很大,每次通信都需要一次請求,HTTP請求頭中帶大量Cookie等信息,浪費帶寬。IE不支持AJAX,因此需要iframe代替。
SSE(Server-Sent Evetns):HTML5的Comet方案。SSEAPI創(chuàng)造到服務(wù)器端的單向連接,服務(wù)端推送的模式,服務(wù)器響應(yīng)的MINE必須是“text/event-stream”,用于服務(wù)器端給客戶端實時傳數(shù)據(jù),只進行一次連接,則后續(xù)服務(wù)端可以一直傳送數(shù)據(jù)。
數(shù)據(jù)流:在長輪詢的基礎(chǔ)上,收到數(shù)據(jù)后不要斷開連接,繼續(xù)接受服務(wù)端數(shù)據(jù);由于數(shù)據(jù)流是不斷的,所以需要客戶端自己來處理解析數(shù)據(jù)和管理游標(biāo),增量處理獲得的數(shù)據(jù),增加了邏輯復(fù)雜度。
Websocket:替代長輪詢方式,減少開銷。
網(wǎng)站題目:html5sse,html5sse SASSCSS3和SassyCSS
本文地址:http://chinadenli.net/article11/dsijedd.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、定制網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、關(guān)鍵詞優(yōu)化、網(wǎng)站建設(shè)、域名注冊
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)