import json import stats class NetworkReader: def __init__(self,stream): self._stream=stream def readMsg(self): data=self._stream.readline() assert data stats.logReceived(data) jsonLength=int(data.split(b":")[1].strip()) # "json-length: length" -> length data=self._stream.readline() assert data stats.logReceived(data) binLength=int(data.split(b":")[1].strip()) # "bin-length: length" -> length jsonData=self._stream.read(jsonLength) assert len(jsonData)==jsonLength stats.logReceived(jsonData) jsonData=json.loads(str(jsonData,encoding="utf-8")) binData=self._stream.read(binLength) assert len(binData)==binLength stats.logReceived(binData) return (jsonData,binData) class NetworkWriter: def __init__(self,stream): self._stream=stream def writeMsg(self,*args): msg=self.prepMsg(*args) self._stream.write(msg) self._stream.flush() stats.logSent(msg) def prepMsg(self,jsonData,binData=b""): jsonData=bytes(json.dumps(jsonData,separators=(',',':'))+"\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))