websocket-client 試用簡記


嘗試重寫WebSocketApp

按照個人理解,某些處理是共用的,因此定義ws默認的on_error,on_close,on_ping,on_pong
就目前使用on_message,on_open所作的處理可能會有不同。

class MyWebsocket(websocket.WebSocketApp):
	url="ws://" # websocket url
	def on_error(mw, error):
	    print(error)
	    print("!!!!!!!!!發生未知錯誤!!!!!!!!!\n關閉連接........\n")
	    mw.close()

	def on_close(mw):
		print("===== closed =======\n")

	def on_ping(mw,message):
	    print("Got a Ping:")
	    print(message)

	def on_pong(mw,message):
	    print("Got a Pong:")
	    print(message)

	def on_data(ws,message,datatype,continueflag):
		print ("D >>> "+str(len(message))+" "+message)

	def __init__(self,url=url,on_error=on_error,on_close=on_close,on_pong=on_pong,on_ping=on_ping, header=None,
		on_open=None, on_message=None,
		on_cont_message=None,
		keep_running=True, get_mask_key=None, cookie=None,
  		subprotocols=None,
		on_data=on_data,is_connect=0,is_sendwav=0,user_id = ""):
		websocket.WebSocketApp.__init__(self, url,on_error=on_error,on_close=on_close,on_pong=on_pong,on_ping=on_ping, header=None,
		on_open=None, on_message=None,
		on_cont_message=None,
		keep_running=True, get_mask_key=None, cookie=None,
  		subprotocols=None,
		on_data=on_data)
		self.on_message=on_message
		self.on_open=on_open
		self.is_connect = is_connect
		self.is_sendwav = is_sendwav
		self.user_id = user_id

試用:

mywebsocket = MyWebsocket(on_open=on_open,on_message=on_message)
mywebsocket.run_forever(ping_interval=60,ping_timeout=30)

Option

設置超時連接

websocket.setdefaulttimeout(5)

enabletrace

websocket.enableTrace(True)

發送文本和binary

json格式

def send_json(ws,data,operateName="test"):
	print("\n【"+operateName+"】")
	ws.send(json.dumps(data))
	pprint(data)
	set_waiting()

試用:

data={
			"user_id":"123",
			"user_name": "dolores"
		}
send_json(mywebsocket,data)

wav

def sendWAV(wav):
		print("============開始發送音頻數據==================")
		step = 3200
		with open(wav, 'rb') as f:
			while True:
				read_data = f.read(step)
				if read_data:
					self.mywebsocket.send(read_data, ABNF.OPCODE_BINARY)
				if len(read_data) < step:
					break
				set_waiting(0.1)
		print("============結束發送音頻數據================")
		set_waiting(10)

sendWAV("./test.wav")

==================2021-05-20 修改 ========================
陰差陽錯之下發現了python 自帶的wave庫.....

import wave
def sendWAV(self,wav):
		print("============開始發送音頻數據==================")
		step = 1600 
		with wave.open(wav, 'rb') as f:
			while True:
				read_data = f.readframes(step)
				if read_data:
					self.mywebsocket.send(read_data, ABNF.OPCODE_BINARY)
				if len(read_data) < step:
					break
				set_waiting(0.1)
		print("============結束發送音頻數據================")
		set_waiting(15)

接收服務器消息

on_message

def on_message(ws, message):
	print("【server message】\n"+message)
  # 服務端返回的是字符串,可按需轉成json格式
	message = json.loads(message)
  print(message["id"])

on_data

def on_data(ws,message,datatype,continueflag):
  print ("D >>> "+str(len(message))+" "+message)

問題

在實際使用時經常出現的問題就是

  1. connection close(沒有 連接成功 即關閉) ,這時候一般是 url或參數有問題
  2. connection refuse(也是沒有連接成功 被拒絕了) ,這時候一般是url錯誤
    e....是否連接成功怎么看,進入on_open一般就是連接成功了
  3. 如果你已經發送了數據,但是服務器就是沒有給你你想要的相應結果,一般是發送的數據格式有問題,確認下自己發送的格式是否和接口文檔描述一致~
  4. 連接成功 但是報錯 error ,這種時候, 有很多種情況.......a. 服務端不穩定 b. 根據error msg 一般能獲得解決方案的....
  5. 之前都好好的....突然不行了.....那肯定是服務端有問題! 我覺得這個不需要懷疑吧~
  6. 怎么關閉ws連接??? 一般來說,不耍流氓的接口(我測試的都是ASR接口)都是有退出機制的, 會告訴你什么時候結束,或者你接收到想要的結果自己退出

上面的內容,主要還是一些知識點整理和個人的一些思考,權當參考,如有錯誤或者更好的建議,可以在評論區指正,不勝感激!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM