websocket中就有建立連接connect、發送消息send等函數可供使用,但是websocket.WebSocketApp將這些都封裝好了,只用在實例化的時候傳入自定義函數即可,更方便。因此這裏選擇使用websocket.WebSocketApp來模擬客戶行爲。
WebSocketApp也是websocket中的一個類。要使用WebSocketApp中的回調函數需要傳入一系列的可調用對象。在實例化該類時傳入構造函數中的on_open、on_message、on_error就需要傳入一系列的可調用對象,例如自定義的函數。
以下是websocket.WebSocketApp類中的構造函數的摘錄,簡單介紹一下各個傳入值的說明。
def init(self, url, header=[], on_open=None, on_message=None, on_error=None, on_close=None, on_ping=None, on_pong=None, on_cont_message=None, keep_running=True,get_mask_key=None, cookie=None, subprotocols=None, on_data=None)
(1)url: websocket的地址。
(2)header: 客戶發送websocket握手請求的請求頭,{‘head1:value1’,‘head2:value2’}。
(3)on_open:在建立Websocket握手時調用的可調用對象,這個方法只有一個參數,就是該類本身。
(4)on_message:這個對象在接收到服務器返回的消息時調用。有兩個參數,一個是該類本身,一個是我們從服務器獲取的字符串(utf-8格式)。
(5)on_error:這個對象在遇到錯誤時調用,有兩個參數,第一個是該類本身,第二個是異常對象。
(6)on_close:在遇到連接關閉的情況時調用,參數只有一個,就是該類本身。
(7)on_cont_message:這個對象在接收到連續幀數據時被調用,有三個參數,分別是:類本身,從服務器接受的字符串(utf-8),連續標誌。
(8)on_data:當從服務器接收到消息時被調用,有四個參數,分別是:該類本身,接收到的字符串(utf-8),數據類型,連續標誌。
(9)keep_running:一個二進制的標誌位,如果爲True,這個app的主循環將持續運行,默認值爲True。
(10)get_mask_key:用於產生一個掩碼。
(11)subprotocols:一組可用的子協議,默認爲空。
除此之外,還有on_ping,on_pong等,詳細內容可以查看源代碼。
另外說明一下該類中的一個方法叫run_forever()。Run_forever是一個無限循環,只要這個websocket連接未斷開,這個循環就會一直進行下去。如果在實現websocket連接時使用了心跳包,可以在這個函數中傳入心跳包的間隔,格式如下:
ws.run_forever(ping_interval=SOCKET_PING_INTERVAL,timeout=SOCKET_TIMEOUT)