WebSocket的事件觸發機制
WebSocket API是純事件驅動的。應用程式程式碼監聽WebSocket物件上的事件,以便處理輸入資料和連線狀態的改變。WebSocket協議也是事件驅動的。客戶端應用程式不需要輪詢伺服器來得到更新的資料。訊息和事件將在伺服器傳送它們的時候非同步到達。
WebSocket程式設計遵循非同步程式設計模式,也就是說,只要WebSocket連線開啟,應用程式就簡單地監聽事件。客戶端不需要主動輪詢伺服器得到更多的資訊。要開始監聽事件,只要為WebSocket物件添加回調函式。也可以使用addEventListener() DOM方法為WebSocket物件新增事件監聽器。
WebSocket物件排程4個不同的事件:
open
message
error
close
和所有Web API一樣,可以用on<事件名稱>處理程式屬性監聽這些事件,也可以使用addEventListener();方法。
- WebSocket事件:open
一旦伺服器響應了WebSocket連線請求,open事件觸發並建立一個連線。open事件對應的回撥函式稱作onopen。
程式碼清單2-4說明建立WebSocket連線時如何處理該事件。
到open事件觸發時,協議握手已經完成,WebSocket已經準備好傳送和接收資料。如果應用程式接收到一個open事件,那麼 可以確定WebSocket伺服器成功地處理了連線請求,並且同意與應用程式通訊。
- WebSocket事件:message
WebSocket訊息包含來自伺服器的資料。你也可能聽說過組成WebSocket訊息的WebSocket幀(Frame)。第3章將詳細討論訊息和幀的概念。為了理解訊息使用API的方式,WebSocket API只輸出完整的訊息,而不是WebSocket幀。message事件在接收到訊息時觸發,對應於該事件的回撥函式是onmessage。
程式碼清單2-5展示了一個接收文字訊息並顯示訊息內容的訊息處理程式。
除了文字,WebSocket訊息還可以處理二進位制資料,這種資料作為Blob訊息(見程式碼清單2-6)或者ArrayBuffer訊息處理(見程式碼清單2-7)。因為設定WebSocket訊息二進位制資料型別的應用程式會影響二進位制訊息,所以必須在讀取資料之前決定用於客戶端二進位制輸入資料的型別。
- WebSocket事件:error
error事件在響應意外故障的時候觸發。與該事件對應的回撥函式為onerror。錯誤還會導致WebSocket連線關閉。如果你接收一個error事件,可以預期很快就會觸發close事件。close事件中的程式碼和原因有時候能告訴你錯誤的根源。error事件處理程式是呼叫伺服器重連邏輯以及處理來自WebSocket物件的異常的最佳場所。程式碼清單2-8展示了監聽error事件的一個例子。
- 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協議時討論關閉的程式碼和它們的含義。