2012-02-01 28 views
12

Quiero escribir el código de Python para enviar un archivo de cliente a servidor. el servidor necesita guardar el archivo enviado desde el cliente. Pero mi código tiene algunos errores que no puedo solucionar. A continuación se muestra el código del servidor:¿Enviar archivo de cliente a servidor usando XMLRPC?

# server.py 
from SimpleXMLRPCServer import SimpleXMLRPCServer 
import os 

server = SimpleXMLRPCServer(('localhost', 9000)) 

def save_data(data): 
    handle = open("x123.dat", "wb") 
    handle.write(data) 
    handle.close() 

server.register_function(save_data, 'save_data') 
server.serve_forever() 

Y el código de cliente:

# client.py 
import sys, xmlrpclib 

proxy = xmlrpclib.Server('http://localhost:9000') 
handle = open(sys.argv[1], "rb") 
proxy.save_data(handle.read()) 
handle.close() 

Pero entonces corro mi código, el cliente devuelve el siguiente error (esto es en Windows):

Traceback (most recent call last): 
File "client.py", line 6, in <module> proxy.save_data(handle.read()) 
File "c:\python27\lib\xmlrpclib.py", line 1224, in __call__ 
    return self.__send(self.__name, args) 
File "c:\python27\lib\xmlrpclib.py", line 1575, in __request 
    verbose=self.__verbose 
File "c:\python27\lib\xmlrpclib.py", line 1264, in request 
    return self.single_request(host, handler, request_body, verbose) 
File "c:\python27\lib\xmlrpclib.py", line 1297, in single_request 
    return self.parse_response(response) 
File "c:\python27\lib\xmlrpclib.py", line 1473, in parse_response 
    return u.close() 
File "c:\python27\lib\xmlrpclib.py", line 793, in close 
    raise Fault(**self._stack[0]) 
xmlrpclib.Fault: <Fault 1: "<class 'xml.parsers.expat.ExpatError'>:not well-formed (invalid token): line 7, column 1"> 

tengo algunas preguntas:

  1. ¿Cómo solucionar el error anterior?

  2. Mi código necesita transferir algunos archivos grandes a veces. Como mi método es tan simple, dudo que sea eficiente para mover datos grandes. ¿Alguien podría sugerir un método mejor para mover archivos grandes? (Por supuesto, es mejor utilizar XMLRPC en Python)

Respuesta

12

lado del servidor:

def server_receive_file(self,arg): 
     with open("path/to/save/filename", "wb") as handle: 
      handle.write(arg.data) 
      return True 

lado del cliente:

with open("path/to/filename", "rb") as handle: 
    binary_data = xmlrpclib.Binary(handle.read()) 
client.server_receive_file(binary_data) 

Esto funcionó para mí.

2

usted desee ver en la xmlrpclib Binary object. Con esta clase puedes codificar y decodificar a/desde una cadena base64.

Cuestiones relacionadas