import json import stats class NetworkReader: def __init__(self, stream): self._stream = stream def read_msg(self): data = self._stream.readline() assert data stats.log_received(data) json_length = int(data.split(b":")[1].strip()) # "json-length: length" -> length data = self._stream.readline() assert data stats.log_received(data) bin_length = int(data.split(b":")[1].strip()) # "bin-length: length" -> length json_data = self._stream.read(json_length) assert len(json_data)==json_length stats.log_received(json_data) json_data = json.loads(str(json_data, encoding="utf-8")) bin_data = self._stream.read(bin_length) assert len(bin_data)==bin_length stats.log_received(bin_data) return (json_data, bin_data) class NetworkWriter: def __init__(self, stream): self._stream = stream def write_msg(self, *args): msg = self.prep_msg(*args) self._stream.write(msg) self._stream.flush() stats.log_sent(msg) def prep_msg(self, json_data, bin_data=b""): json_data = bytes(json.dumps(json_data, separators=(',', ':'))+"\n", encoding="utf-8") json_length = bytes("json-length: "+str(len(json_data))+"\n", encoding="utf-8") bin_length = bytes("bin-length: "+str(len(bin_data))+"\n", encoding="utf-8") return b"".join((json_length, bin_length, json_data, bin_data))