2012-02-01 12 views
12

मैं क्लाइंट से सर्वर पर फ़ाइल भेजने के लिए पायथन कोड लिखना चाहता हूं। सर्वर को क्लाइंट से भेजी गई फ़ाइल को सहेजने की आवश्यकता है। लेकिन मेरे कोड में कुछ बग हैं जिन्हें मैं ठीक नहीं कर सकता।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() 

और ग्राहक कोड: नीचे अपने सर्वर कोड है

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"> 
:

# client.py 
import sys, xmlrpclib 

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

लेकिन तब मैं अपने कोड चलाने के लिए, ग्राहक निम्न त्रुटि (यह विंडोज पर है) रिटर्न

मैं कुछ सवाल हैं:

  1. उपरोक्त बग को कैसे ठीक करें?

  2. मेरे कोड को कभी-कभी कुछ बड़ी फ़ाइलों को स्थानांतरित करने की आवश्यकता होती है। चूंकि मेरी विधि बहुत सरल है, मुझे संदेह है कि यह बड़े डेटा को स्थानांतरित करने के लिए सक्षम है। क्या कोई बड़ी फाइलों को स्थानांतरित करने के लिए बेहतर तरीका सुझा सकता है?

उत्तर

12

सर्वर साइड:

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

क्लाइंट साइड:

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

यह मेरे लिए काम किया।

2

आप xmlrpclib Binary object में देखना चाहते हैं (बेशक यह अजगर पर XMLRPC उपयोग करने के लिए बेहतर है)। इस वर्ग के साथ आप बेस 64 स्ट्रिंग से/एन्कोड और डीकोड कर सकते हैं।

संबंधित मुद्दे