WebsocketServer@Pythonに何を使うか見直す

そうそう、バイナリの送受信のテストをしていなかった

あれこれつくるためには、事前にあれこれテストをして問題点を抽出、解決させておくわけですが、

あれ?WebSocketでバイナリの送受信のテストしてたっけ?

はい。してませんでした。

ということで、でれでれ、あれやこれややってるのですが、

あれ?このクラスだと事実上バイナリ送受信できない?そもそも使いにくい?

ということで、こんなん、探せば、、いくらでもあるだろ(o^^o)

なんてタカをくくっていたのですが、意外なほどにない!
で、やっとみつけました。
ネーミングが控えめですが、なかなか良いと思います。
これです。

SimpleWebSocketServerという選択

ということでこんなんみつけました。
https://github.com/dpallot/simple-websocket-server

さて、どうやって使うかです。
2択か3択かありますが、、

●そのまま気合で使う
 ➡ちょっとやりたいことができない
●継承して使う
 ➡仮想関数とか作り直すとか、、継承先で同じようなコードを書くとか、、あまりおもしろくない
●独自クラスを作成してその参照をSImpleWebSocketServer側にもたす
 ➡これっすかね。

やっぱ元来C++屋なので、とにかくポインタ渡しとけばなんとかなるだろ!って発想(o^^o)

です。

SimpleWebSocketServer にちょっとだけ手をいれる

使われ方としては、

	#hiraWebSocketSVは独自クラス。ここであれこれやる。
	C = hiraWebSocketSV()
	#hiraWebSocketSVoneはコネクションひとつにひとつ生成されるクラス
	server = SimpleWebSocketServer('0.0.0.0', const.HIRA_USE_WS_PORT_CLIENT, hiraWebSocketSVone)
	server.setAlter(C)
	server.serveforever()

こんな感じなのです。
serverforeverで動作開始させる直前に、setAlterで独自クラスインスタンスの参照を渡します。
渡される方は、別に、これだけです。

	def setAlter(self, v):
		self.Alter	= v

まず、開始(serveforever)の先頭に次を追加して、独自クラスに、逆に参照します。

	def serveforever(self):
		if(self.Alter):
			self.Alter.setSWS(self)

別に外側で生成してるんだから、外側(独自クラス側)でやってもいいのですが、、スッキリしたいときに、1行でも余計なものがあると、、、って感じな気がしたので、こっちに入れました。

そして、Connectionが張られたときに、Connectionを新規に生成するわけですが、そこでも、こんなことします。

	def _constructWebSocket(self, sock, address):
		try:
			a = self.websocketclass(self, sock, address)
			a.setAlter(self.Alter)#1 conenctionにも独自クラスの参照を渡す
			return a
		except Exception as e:
			print("------------------------")
			print("_constructWebSocket:Except",e)
			print("------------------------")
		return	None

そう、あれもこれも参照渡し、渡し渡され芸術的スパゲッティの完成です。
よ ゐ こは真似をしてはいけません。

あとは、、Connectionが張られた時以外にも、クライアントが削除されたときにもAlterを経由してmethodを実行して、独自クラス側でも、クライアント単位で管理をします。

コメントする

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