2012-02-01 18 views
12

Voglio scrivere il codice Python per inviare un file dal client al server. il server deve salvare il file inviato dal client. Ma il mio codice ha alcuni bug che non riesco a risolvere. Qui di seguito è il mio codice del server:Invia file da client a server utilizzando 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() 

E il codice del client:

# client.py 
import sys, xmlrpclib 

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

Ma poi ho eseguito il mio codice, il cliente restituisce il seguente errore (questo è su 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"> 

ho alcune domande:

  1. Come risolvere il bug precedente?

  2. Il mio codice deve talvolta trasferire alcuni file di grandi dimensioni. Dato che il mio metodo è così semplice, dubito che sia efficiente per lo spostamento di big data. Qualcuno potrebbe suggerire un metodo migliore per spostare file di grandi dimensioni? (Naturalmente è meglio usare XMLRPC su Python)

risposta

12

:

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

lato client:

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

questo ha funzionato per me.

2

Si vuole esaminare la xmlrpclib Binary object. Con questa classe è possibile codificare e decodificare da/a una stringa base64. Lato server

Problemi correlati