Exemplo n.º 1
0
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
Exemplo n.º 2
0
 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
Exemplo n.º 3
0
 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