import threading
import queue
import json
class NetworkReader(threading.Thread):
def __init__(self,stream):
threading.Thread.__init__(self,daemon=True)
self.parent=threading.current_thread()
self.stream=stream
self.output=queue.Queue()
def run(self):
while True:
if not self.parent.is_alive(): return
self.output.put(self.readMsg(),timeout=2)
def readMsg(self):
data=self.stream.readline()
if not data: pass # !! raise something
jsonLength=int(data.split(b":")[1].strip()) # "json-length: length" -> length
data=self.stream.readline()
if not data: pass # !! raise something
binLength=int(data.split(b":")[1].strip()) # "bin-length: length" -> length
jsonData=self.stream.read(jsonLength)
jsonData=json.loads(str(jsonData,encoding="utf-8"))
binData=self.stream.read(binLength)
return (jsonData,binData)
class NetworkWriter(threading.Thread):
def __init__(self,stream):
threading.Thread.__init__(self,daemon=True)
self.parent=threading.current_thread()
self.stream=stream
self.input=queue.Queue()
def run(self):
while True:
if not self.parent.is_alive(): return
msg=self.input.get(timeout=2)
if msg is None: return
self.stream.write(self.writeMsg(msg))
self.stream.flush()
def writeMsg(self,msg):
jsonData,binData=msg
jsonData=bytes(json.dumps(jsonData)+"\n",encoding="utf-8")
jsonLength=bytes("json-length: "+str(len(jsonData))+"\n",encoding="utf-8")
binLength=bytes("bin-length: "+str(len(binData))+"\n",encoding="utf-8")
return b"".join((jsonLength,binLength,jsonData,binData))