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))