溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時間:2022-03-08 10:17:15 來源:億速云 閱讀:159 作者:iii 欄目:web開發(fā)

這篇文章主要介紹“HTML5的WebSocket與服務(wù)器推送事件實例分析”的相關(guān)知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“HTML5的WebSocket與服務(wù)器推送事件實例分析”文章能幫助大家解決問題。

WebSockets

Web Sockets 是用于 Web 應(yīng)用程序的新一代雙向通信技術(shù),運行在單一套接字之上,它通過 JavaScript 接口暴漏在 HTML5 兼容的瀏覽器中。

一旦取得 Web 服務(wù)器上的 Web Socket 連接之后,就可以通過調(diào)用 send() 方法從瀏覽器發(fā)送數(shù)據(jù)到服務(wù)器上,通過 onmessage 事件處理程序從服務(wù)器接收數(shù)據(jù)到瀏覽器中。

下面是創(chuàng)建一個新的 WebSocket 對象的 API。

JavaScript Code復(fù)制內(nèi)容到剪貼板

var Socket = new WebSocket(url, [protocal] );  

第一個參數(shù) url 用于指定要連接的 URL。第二個屬性 - 端口是可選的,如果提供,就會指定一個服務(wù)器必須支持連接成功的子協(xié)議。

WebSocket 屬性

下面是 WebSocket 對象的屬性。假定我們已經(jīng)創(chuàng)建了上述的 Socket 對象:

屬性 描述

Socket.readyState

只讀屬性readyState表示連接的狀態(tài)。有以下取值:

0 表示連接尚未建立。

1 表示連接已建立,可以進行通信。

2 表示連接正在進行關(guān)閉握手。

3 表示連接已經(jīng)關(guān)閉或者連接不能打開。

Socket.bufferedAmount

只讀屬性bufferedAmount表示已經(jīng)使用 send() 方法排隊的 URF-8 文本字節(jié)數(shù)。

WebSocket 事件

下面是 WebSocket 對象相關(guān)的事件。假定我們已經(jīng)創(chuàng)建了上述的 Socket 對象:

事件 事件處理程序 描述

open Socket.onopen 建立 socket 連接時觸發(fā)這個事件。

message Socket.onmessage 客戶端從服務(wù)器接收數(shù)據(jù)時觸發(fā)。

error Socket.onerror 連接發(fā)生錯誤時觸發(fā)。

close Socket.onclose 連接被關(guān)閉時觸發(fā)。

WebSocket 方法

下面是 WebSocket 對象相關(guān)的方法。假定我們已經(jīng)創(chuàng)建了上述的 Socket 對象:

方法 描述

Socket.send()

send(data) 方法使用連接傳輸數(shù)據(jù)。

Socket.close()

close() 方法用于終止任何現(xiàn)有連接。

服務(wù)器推送事件

傳統(tǒng)的 Web 應(yīng)用程序生成發(fā)送到 Web 服務(wù)器端的事件。比如,點擊一個鏈接會從服務(wù)器請求一個新頁面。

這種從 Web 瀏覽器到 Web 服務(wù)器的時間類型可以稱作客服端事件。

隨著 HTML5 的出現(xiàn),WHATWG Web Applications 1.0 引入了一個從 Web 服務(wù)器到 Web 瀏覽器的事件流,被稱作服務(wù)器推送事件(SSE)。使用 SSE 可以不停的將 DOM 事件推送到用戶的瀏覽器中。

這個事件流方法會打開一個到服務(wù)器的持久連接,新消息可用時發(fā)送數(shù)據(jù)到客戶端,從而不再需要持續(xù)的輪詢。

SSE Web 應(yīng)用程序

要在 Web 應(yīng)用程序中使用服務(wù)器推送事件,我們需要給文檔添加一個 <eventsource>元素。

<eventsource> 元素的 src 屬性應(yīng)該指向一個 URL,這個 URL 應(yīng)該提供一個 HTTP 持久連接用于發(fā)送包含事件的數(shù)據(jù)流。

這個 URL 將會指向一個持續(xù)發(fā)送事件數(shù)據(jù)的 PHP,PERL 或者任意 Python 腳本。下面是一個簡單的期望獲得服務(wù)器時間的 Web 應(yīng)用程序示例。

XML/HTML Code復(fù)制內(nèi)容到剪貼板

<!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,如下所示:

復(fù)制代碼

代碼如下:

print "Content-Type: text/event-stream/n/n";

設(shè)置 Content-type 之后,服務(wù)器端腳本將發(fā)送一個后面緊跟事件名稱的 Event: 標(biāo)簽。下面的示例將會發(fā)送一個以換行符結(jié)束的 Server-Time 作為事件名稱。

復(fù)制代碼

代碼如下:

print "Event: server-time/n";

最后一步是使用 Data: 標(biāo)簽發(fā)送事件數(shù)據(jù),緊隨其后的是以換行符結(jié)束的整數(shù)字符串值,如下所示:

復(fù)制代碼

代碼如下:

$time = localtime();

print "Data: $time/n";

下面是用 perl 編寫的完整 ticker.cgi:

復(fù)制代碼

代碼如下:

#!/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)用程序來處理服務(wù)器推送時間。下面是最終示例:

XML/HTML Code復(fù)制內(nèi)容到剪貼板

<!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>  

在測試服務(wù)器推送事件之前,建議你確保你的 Web 瀏覽器支持這一概念。

關(guān)于“HTML5的WebSocket與服務(wù)器推送事件實例分析”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI