WebSocketを今一度整理その2

ということで、、Clientの方の使われ方から。
こんな感じ。
recvExecがoverrideすべき部分で、こっからあれこれを。
送信はself.sendでOK

#定義
#	hiraWSCL がWebSokcetClientの基本のクラス
class CustomXXX_WS_CL(hiraWSCL):
	def recvExec(self,dat):
		print(f"CustomXXX_WS_CL:recvExec:dat:{dat}")
	
#使う
	host=xxxxxx
	port=zzzzzz
	A = CustomXXX_WS_CL(host,port)
	A.setParent(self)
	if A.connect():
		S = hiraThread(target = A.recvLoop)
		S.start()
import const
import hiraSetting
import threading
import tracemalloc
import time
import asyncio
import websockets
from hiraThread import hiraThread
class hiraWSCL:
	parent		= None
	def setParent(self,parent):
		self.parent	= parent
	def __init__(self, host, port):
		self.loopRun	= False
		self.URI		= "ws://" + host + ":" + str(port)
		self.WS			= None
		self.myLoop		= asyncio.new_event_loop()  
		asyncio.set_event_loop(self.myLoop)
		print(f"init: {self.URI}")
	def setURI(self, uri):
		self.URI = uri
	async def async_connect(self):
		try:
			self.WS = await websockets.connect(self.URI)
		except Exception as e:
			print(f"async_connect---Exception:{e}")
			return	False
		return	True
	async def async_close(self):
		try:
			await self.WS.close()
		except Exception as e:
			print(f"async_close---Exception:{e}")
			return	False
		return	True
	async def async_send(self, mes):
		try:
			await self.WS.send(mes)
		except Exception as e:
			print(f"Exception:{e}")
			return	None
	async def async_recv(self):
		try:
			dat = await self.WS.recv()
			return	dat
		except Exception as e:
			print(f"Exception:{e}")
			return	None
	def connect(self):
		B = self.myLoop.run_until_complete(self.async_connect())
		return	B
	def close(self):
		B = self.myLoop.run_until_complete(self.async_close())
		return	B
	def send(self, mes):
		asyncio.run_coroutine_threadsafe(self.async_send(mes), self.myLoop)
	def recv(self):
		return self.myLoop.run_until_complete(self.async_recv())
	def recvLoop(self):
		self.loopRun	= True
		while True:
			dat = self.myLoop.run_until_complete(self.async_recv())
			if dat == None:
				break
			self.recvExec(dat)
		self.loopRun	= False
	def recvExec(self,dat):
		print(f"dat:{dat}")
	def exec(host, port):
		C = hiraWSCL(host, port)
		if C.connect():
			S = hiraThread(target = C.recvLoop,)
			S.start()
			return	C
		else:
			return	None

こんなとこかなー。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です