def decode(sock): head = sock.recv(4, socket.MSG_WAITALL) if not head: return None assert len(head) == 4 length, = struct.unpack(">l", head) assert length > 8 body = sock.recv(length, socket.MSG_WAITALL) assert len(body) == length assert "RPC0" == body[:4] cksum, = struct.unpack(">l", body[-4:]) cksum2 = zlib.adler32(body[:-4]) assert cksum == cksum2 message = rpc_pb2.RpcMessage() message.ParseFromString(body[4:-4]) return message
def CallMethod(self, method_descriptor, rpc_controller, request, response_class, done): message = rpc_pb2.RpcMessage() message.type = rpc_pb2.REQUEST self.count += 1 message.id = self.count message.service = method_descriptor.containing_service.name message.method = method_descriptor.name message.request = request.SerializeToString() wire = encode(message) self.sock.sendall(wire) responseMessage = decode(self.sock) assert responseMessage.type == rpc_pb2.RESPONSE assert responseMessage.id == message.id response = response_class() response.ParseFromString(responseMessage.response) return response
def serveOneClient(self, service): (clientsocket, address) = self.serversocket.accept() print "got connection from", address while True: message = decode(clientsocket) if not message: clientsocket.close() break assert message.type == rpc_pb2.REQUEST assert message.service == service.GetDescriptor().name method = service.GetDescriptor().FindMethodByName(message.method) request_class = service.GetRequestClass(method) request = request_class() request.ParseFromString(message.request) response = service.CallMethod(method, None, request, None) responseMessage = rpc_pb2.RpcMessage() responseMessage.type = rpc_pb2.RESPONSE responseMessage.id = message.id responseMessage.response = response.SerializeToString() wire = encode(responseMessage) clientsocket.sendall(wire) print "connection is down", address