2012-02-01 61 views
12

Tôi muốn viết mã Python để gửi tệp từ máy khách đến máy chủ. máy chủ cần lưu tệp được gửi từ ứng dụng khách. Nhưng mã của tôi có một số lỗi mà tôi không thể sửa chữa. Dưới đây là mã máy chủ của tôi:Gửi tệp từ máy khách đến máy chủ bằng 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() 

Và mã khách hàng:

# client.py 
import sys, xmlrpclib 

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

Nhưng sau đó tôi chạy mã của tôi, khách hàng sẽ trả về lỗi sau (đây là trên 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"> 

Tôi có một số câu hỏi:

  1. Làm thế nào để sửa lỗi trên?

  2. Mã của tôi cần phải chuyển đôi khi một số tệp lớn. Vì phương pháp của tôi rất đơn giản, tôi nghi ngờ rằng nó có hiệu quả trong việc di chuyển dữ liệu lớn. Ai có thể xin đề nghị một phương pháp tốt hơn để di chuyển các tập tin lớn? (Tất nhiên tốt hơn là sử dụng XMLRPC trên Python)

Trả lời

12

Server side:

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

Khách hàng bên:

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

này đã làm việc cho tôi.

2

Bạn muốn xem xét xmlrpclib Binary object. Với lớp này, bạn có thể mã hóa và giải mã thành/từ chuỗi base64.

Các vấn đề liên quan