def recv(self): #每次读一个完整的字节,再接收前4个字节,再取body conn = self.socket toread = 5 readn = 0 lengthbyte = b'' while 1: bufsize = toread - readn if bufsize <= 0: break bytearr = conn.recv(bufsize) if len(bytearr) == 0: raise Exception('peer closed') lengthbyte = lengthbyte + bytearr readn = readn + len(bytearr) lengthField = lengthbyte[:4] compressField = lengthbyte[4:5] isEnableCompress = 0 if compressField == b'1': isEnableCompress = 1 toread = struct.unpack("i", lengthField)[0] readn = 0 msg = b'' while 1: bufsize = toread - readn if bufsize <= 0: break bytearr = conn.recv(bufsize) if len(bytearr) == 0: raise Exception('peer closed') msg = msg + bytearr readn = readn + len(bytearr) if isEnableCompress: msg = RpcCompress.decompress(msg) return msg
async def handle(self, reader, writer): while 1: try: data = await reader.read(5) lengthField = data[:4] compressField = data[4:5] isEnableCompress = 0 if compressField == b'1': isEnableCompress = 1 toread = struct.unpack("i", lengthField)[0] msg = await reader.read(toread) if isEnableCompress: msg = RpcCompress.decompress(msg) request = self.protocal.unserialize(msg) func, args, kwargs = self.protocal.parseRequest(request) resp = await self.run(func, args, kwargs) respbytes = self.protocal.serialize(resp) isEnableCompress = b'0' if len(msg) >= RpcCompress.enableCompressLen: isEnableCompress = b'1' respbytes = RpcCompress.compress(respbytes) lenbytes = struct.pack("i", len(respbytes)) writer.write(lenbytes + isEnableCompress + respbytes) except Exception as ex: writer.close() return
def recv(self, conn=None): if conn == None: conn = self.socket package, addr = conn.recvfrom(100000) isEnableCompress = package[:1] msg = package[1:] if isEnableCompress == b'1': msg = RpcCompress.decompress(msg) return msg, addr
def callback(self, package): isEnableCompress = package[:1] msg = package[1:] if isEnableCompress == b'1': msg = RpcCompress.decompress(msg) request = self.protocal.unserialize(msg) func, args, kwargs = self.protocal.parseRequest(request) resp = self.run(func, args, kwargs) resp = self.protocal.serialize(resp) return resp
def recvPeer(self, conn): #每次读一个完整的字节,再接收前4个字节,再取body toread = 4 readn = 0 lengthbyte = b'' while 1: bufsize = toread - readn if bufsize <= 0: break bytearr = conn.recv(bufsize) if len(bytearr) == 0: raise Exception('peer closed') lengthbyte = lengthbyte + bytearr readn = readn + len(bytearr) #读取是否压缩字段 toread = 1 readn = 0 msg = b'' while 1: bufsize = toread - readn if bufsize <= 0: break bytearr = conn.recv(bufsize) if len(bytearr) == 0: raise Exception('peer closed') msg = msg + bytearr readn = readn + len(bytearr) isEnableCompress = 0 if msg == b'1': isEnableCompress = 1 toread = struct.unpack("i", lengthbyte)[0] readn = 0 msg = b'' while 1: bufsize = toread - readn if bufsize <= 0: break bytearr = conn.recv(bufsize) if len(bytearr) == 0: raise Exception('peer closed') msg = msg + bytearr readn = readn + len(bytearr) if isEnableCompress: msg = RpcCompress.decompress(msg) return msg