WebSocket的事件觸發機制
WebSocket API是純事件驅動的。應用程式程式碼監聽WebSocket物件上的事件,以便處理輸入資料和連線狀態的改變。WebSocket協議也是事件驅動的。客戶端應用程式不需要輪詢伺服器來得到更新的資料。訊息和事件將在伺服器傳送它們的時候非同步到達。
WebSocket程式設計遵循非同步程式設計模式,也就是說,只要WebSocket連線開啟,應用程式就簡單地監聽事件。客戶端不需要主動輪詢伺服器得到更多的資訊。要開始監聽事件,只要為WebSocket物件新增回撥函式。也可以使用addEventListener() DOM方法為WebSocket物件新增事件監聽器。
WebSocket物件排程4個不同的事件:
open
message
error
close
和所有Web API一樣,可以用on<事件名稱>處理程式屬性監聽這些事件,也可以使用addEventListener();方法。
1. WebSocket事件:open
一旦伺服器響應了WebSocket連線請求,open事件觸發並建立一個連線。open事件對應的回撥函式稱作onopen。
程式碼清單2-4說明建立WebSocket連線時如何處理該事件。
到open事件觸發時,協議握手已經完成,WebSocket已經準備好傳送和接收資料。如果應用程式接收到一個open事件,那麼 可以確定WebSocket伺服器成功地處理了連線請求,並且同意與應用程式通訊。
2. WebSocket事件:message
WebSocket訊息包含來自伺服器的資料。你也可能聽說過組成WebSocket訊息的WebSocket幀(Frame)。第3章將詳細討論訊息和幀的概念。為了理解訊息使用API的方式,WebSocket API只輸出完整的訊息,而不是WebSocket幀。message事件在接收到訊息時觸發,對應於該事件的回撥函式是onmessage。
程式碼清單2-5展示了一個接收文字訊息並顯示訊息內容的訊息處理程式。
除了文字,WebSocket訊息還可以處理二進位制資料,這種資料作為Blob訊息(見程式碼清單2-6)或者ArrayBuffer訊息處理(見程式碼清單2-7)。因為設定WebSocket訊息二進位制資料型別的應用程式會影響二進位制訊息,所以必須在讀取資料之前決定用於客戶端二進位制輸入資料的型別。
3. WebSocket事件:error
error事件在響應意外故障的時候觸發。與該事件對應的回撥函式為onerror。錯誤還會導致WebSocket連線關閉。如果你接收一個error事件,可以預期很快就會觸發close事件。close事件中的程式碼和原因有時候能告訴你錯誤的根源。error事件處理程式是呼叫伺服器重連邏輯以及處理來自WebSocket物件的異常的最佳場所。程式碼清單2-8展示了監聽error事件的一個例子。
4. WebSocket事件:close
close事件在WebSocket連線關閉時觸發。對應於close事件的回撥函式是onclose。一旦連線關閉,客戶端和伺服器不再能接收或者傳送訊息。
說明 WebSocket規範還定義了ping和pong幀,可以用於持續連線(keep-alive)、心跳、網路狀態檢測、延遲測量等,但是WebSocket API目前沒有輸出這些特性。儘管瀏覽器接受ping幀,但是不會觸發對應WebSocket上的ping事件。相反,瀏覽器將自動響應pong幀。然而,瀏覽器例項化的ping如果在一段時間內沒有得到pong應答,可能會觸發連線的close事件。第8章將詳細介紹WebSocket的ping和pong。
當呼叫close()方法終止與伺服器的連線時,也會觸發onclose事件處理程式,如程式碼清單2-9所示。
WebSocket close事件在連線關閉時觸發,這可能有多種原因,比如連線失敗或者成功的WebSocket關閉握手。WebSocket物件特性readyState反映了連線的狀態(2為正在關閉,3為已關閉)。
close事件有3個有用的屬性(property),可以用於錯誤處理和恢復:wasClean、code和error。wasClean屬性是一個布林屬性,表示連線是否順利關閉。如果WebSocket的關閉是對來自伺服器的一個close幀的響應,則該屬性為true。如果連線是因為其他原因(例如,因為底層TCP連線關閉)關閉,則該屬性為false。code和reason屬性表示伺服器傳送的關閉握手狀態。這些屬性和WebSocket.close()方法中的code和reason引數一致,我們將在本章後面詳加介紹。在第3章中,我們將在討論WebSocket協議時討論關閉的程式碼和它們的含義。
說明 關於WebSocket事件的更多細節,參見WebSocket API規範:http://www.w3.org/TR/websockets/。
相關文章
- Yii中事件觸發機制事件
- 觸控事件分發核心機制優化吸收事件優化
- android觸控事件分發機制,曾困惑你我的地方Android事件
- Android觸控事件傳遞機制Android事件
- Android中TouchEvent觸控事件機制Android事件
- Android 觸控事件處理機制Android事件
- Android中觸控事件的傳遞機制Android事件
- 初識Android觸控事件傳遞機制Android事件
- iOS中觸控事件的傳遞和響應機制iOS事件
- View事件分發機制View事件
- 探索View的事件分發機制View事件
- View的事件分發機制分析View事件
- 那些你曾不知道的觸控事件—Android分發機制完全解析事件Android
- 前端面試之瀏覽器機制中觸發事件的三個階段前端面試瀏覽器事件
- OO ALV 強制觸發 data_change事件事件
- View事件分發機制分析View事件
- Android事件分發機制Android事件
- Android的MotionEvent事件分發機制Android事件
- Android 事件分發機制的理解Android事件
- Android View 的事件體系 -- 事件分發機制AndroidView事件
- 取消事件觸發事件
- 有趣的觸發器事件觸發器事件
- Redis的事件機制Redis事件
- 【PB】事件的觸發時機及先後順序事件
- 事件分發機制(一):解惑篇事件
- cocos EventDispatcher事件分發機制事件
- TouchEvent事件分發機制全解析事件
- Android事件分發機制探究Android事件
- Android事件分發機制解析Android事件
- 淺談JS事件機制與React事件機制JS事件React
- JS的事件物件與事件機制JS事件物件
- Android觸控事件(下)——事件的分發Android事件
- 淺談HTML5 WebSocket的機制HTMLWeb
- Android事件分發機制三:事件分發工作流程Android事件
- Javascript事件模型系列(二)事件的捕獲-冒泡機制及事件委託機制JavaScript事件模型
- iris 的 websocket 初始接觸Web
- 淺談Android中的事件分發機制Android事件
- 面試:講講 Android 的事件分發機制面試Android事件