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を実行して、独自クラス側でも、クライアント単位で管理をします。