淺析HTML5的WebSocket與服務(wù)器推送事件

WebSockets
Web Sockets 是用于 Web 應(yīng)用程序的新一代雙向通信技術(shù),運(yùn)行在單一套接字之上,它通過(guò) JavaScript 接口暴漏在 HTML5 兼容的瀏覽器中。
一旦取得 Web 服務(wù)器上的 Web Socket 連接之后,就可以通過(guò)調(diào)用 send() 方法從瀏覽器發(fā)送數(shù)據(jù)到服務(wù)器上,通過(guò) onmessage 事件處理程序從服務(wù)器接收數(shù)據(jù)到瀏覽器中。
下面是創(chuàng)建一個(gè)新的 WebSocket 對(duì)象的 API。
- var Socket = new WebSocket(url, [protocal] );
第一個(gè)參數(shù) url 用于指定要連接的 URL。第二個(gè)屬性 - 端口是可選的,如果提供,就會(huì)指定一個(gè)服務(wù)器必須支持連接成功的子協(xié)議。
WebSocket 屬性
下面是 WebSocket 對(duì)象的屬性。假定我們已經(jīng)創(chuàng)建了上述的 Socket 對(duì)象:
屬性 | 描述 |
---|---|
Socket.readyState |
只讀屬性readyState表示連接的狀態(tài)。有以下取值:
|
Socket.bufferedAmount |
只讀屬性bufferedAmount表示已經(jīng)使用 send() 方法排隊(duì)的 URF-8 文本字節(jié)數(shù)。 |
WebSocket 事件
下面是 WebSocket 對(duì)象相關(guān)的事件。假定我們已經(jīng)創(chuàng)建了上述的 Socket 對(duì)象:
事件 | 事件處理程序 | 描述 |
---|---|---|
open | Socket.onopen | 建立 socket 連接時(shí)觸發(fā)這個(gè)事件。 |
message | Socket.onmessage | 客戶端從服務(wù)器接收數(shù)據(jù)時(shí)觸發(fā)。 |
error | Socket.onerror | 連接發(fā)生錯(cuò)誤時(shí)觸發(fā)。 |
close | Socket.onclose | 連接被關(guān)閉時(shí)觸發(fā)。 |
WebSocket 方法
下面是 WebSocket 對(duì)象相關(guān)的方法。假定我們已經(jīng)創(chuàng)建了上述的 Socket 對(duì)象:
方法 | 描述 |
---|---|
Socket.send() |
send(data) 方法使用連接傳輸數(shù)據(jù)。 |
Socket.close() |
close() 方法用于終止任何現(xiàn)有連接。 |
服務(wù)器推送事件
傳統(tǒng)的 Web 應(yīng)用程序生成發(fā)送到 Web 服務(wù)器端的事件。比如,點(diǎn)擊一個(gè)鏈接會(huì)從服務(wù)器請(qǐng)求一個(gè)新頁(yè)面。
這種從 Web 瀏覽器到 Web 服務(wù)器的時(shí)間類型可以稱作客服端事件。
隨著 HTML5 的出現(xiàn),WHATWG Web Applications 1.0 引入了一個(gè)從 Web 服務(wù)器到 Web 瀏覽器的事件流,被稱作服務(wù)器推送事件(SSE)。使用 SSE 可以不停的將 DOM 事件推送到用戶的瀏覽器中。
這個(gè)事件流方法會(huì)打開(kāi)一個(gè)到服務(wù)器的持久連接,新消息可用時(shí)發(fā)送數(shù)據(jù)到客戶端,從而不再需要持續(xù)的輪詢。
SSE Web 應(yīng)用程序
要在 Web 應(yīng)用程序中使用服務(wù)器推送事件,我們需要給文檔添加一個(gè) <eventsource>元素。
<eventsource> 元素的 src 屬性應(yīng)該指向一個(gè) URL,這個(gè) URL 應(yīng)該提供一個(gè) HTTP 持久連接用于發(fā)送包含事件的數(shù)據(jù)流。
這個(gè) URL 將會(huì)指向一個(gè)持續(xù)發(fā)送事件數(shù)據(jù)的 PHP,PERL 或者任意 Python 腳本。下面是一個(gè)簡(jiǎn)單的期望獲得服務(wù)器時(shí)間的 Web 應(yīng)用程序示例。
- <!DOCTYPE HTML>
- <html>
- <head>
- <script type="text/javascript">
- /* Define event handling logic here */
- </script>
- </head>
- <body>
- <div id="sse">
- <eventsource src="/cgi-bin/ticker.cgi" />
- </div>
- <div id="ticker">
- <TIME>
- </div>
- </body>
- </html>
SSE 服務(wù)器端腳本
服務(wù)器端腳本應(yīng)該發(fā)送 Content-type 頭指定類型為 text/event-stream,如下所示:
設(shè)置 Content-type 之后,服務(wù)器端腳本將發(fā)送一個(gè)后面緊跟事件名稱的 Event: 標(biāo)簽。下面的示例將會(huì)發(fā)送一個(gè)以換行符結(jié)束的 Server-Time 作為事件名稱。
最后一步是使用 Data: 標(biāo)簽發(fā)送事件數(shù)據(jù),緊隨其后的是以換行符結(jié)束的整數(shù)字符串值,如下所示:
print "Data: $time\n";
下面是用 perl 編寫(xiě)的完整 ticker.cgi:
#!/usr/bin/perl
print "Content-Type: text/event-stream\n\n";
while(true){
print "Event: server-time\n";
$time = localtime();
print "Data: $time\n";
sleep(5);
處理服務(wù)器推送事件
讓我們修改一下我們的 Web 應(yīng)用程序來(lái)處理服務(wù)器推送時(shí)間。下面是最終示例:
- <!DOCTYPE HTML>
- <html>
- <head>
- <script type="text/javascript">
- document.getElementsByTagName("eventsource")[0].
- addEventListener("server-time", eventHandler, false);
- function eventHandler(event)
- {
- // Alert time sent by the server
- document.querySelector('#ticker').innerHTML = event.data;
- }
- </script>
- </head>
- <body>
- <div id="sse">
- <eventsource src="/cgi-bin/ticker.cgi" />
- </div>
- <div id="ticker" name="ticker">
- [TIME]
- </div>
- </body>
- </html>
在測(cè)試服務(wù)器推送事件之前,建議你確保你的 Web 瀏覽器支持這一概念。
相關(guān)文章
HTML5+WebSocket實(shí)現(xiàn)多文件同時(shí)上傳的實(shí)例
本篇文章主要介紹了HTML5-WebSocket實(shí)現(xiàn)多文件同時(shí)上傳的實(shí)例,HTML5結(jié)合Websocket進(jìn)行文件的傳輸就變得更加方便和靈活,有興趣的可以了解一下。2016-12-29HTML5-WebSocket實(shí)現(xiàn)聊天室示例
本篇文章主要介紹了HTML5-WebSocket實(shí)現(xiàn)聊天室示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2016-12-15HTML5實(shí)現(xiàn)WebSocket協(xié)議原理淺析
這篇文章主要為大家介紹了HTML5實(shí)現(xiàn)WebSocket協(xié)議原理,可以幫助初學(xué)者理解WebSocket協(xié)議,需要的朋友可以參考下2014-07-07html5的websockets全雙工通信詳解學(xué)習(xí)示例
本文主要研究HTML5 WebSockets的使用方法,它是HTML5中最強(qiáng)大的通信功能,定義了一個(gè)全雙工的通信信道,只需Web上的一個(gè)Socket即可進(jìn)行通信,能減少不必要的網(wǎng)絡(luò)流量并降低2014-02-26利用html5的websocket實(shí)現(xiàn)websocket聊天室
利用html5的websocket實(shí)現(xiàn)一個(gè)聊天室,大家可以參考使用2013-12-12html5-websocket基于遠(yuǎn)程方法調(diào)用的數(shù)據(jù)交互實(shí)現(xiàn)
一般在傳統(tǒng)網(wǎng)頁(yè)中注冊(cè)用戶信息都是通過(guò)post或ajax提交到頁(yè)面處理,到了HTML5后我們有另一種方法就是通過(guò)websocket進(jìn)行數(shù)據(jù)交互,接下來(lái)將詳細(xì)介紹,需要了解的朋友可以參考下2012-12-04- 這篇文章主要介紹了基于HTML5的WebSocket的實(shí)例代碼,需要的朋友可以參考下2018-08-15