在一台VPS上设立服务端:
import argparse
import xmlrpclib
import threading
from SimpleXMLRPCServer import SimpleXMLRPCServer
# some trivial functions
def add(x,y):
return x+y
def subtract(x, y):
return x-y
def multiply(x, y):
return x*y
def divide(x, y):
return x/y
class ServerThread(threading.Thread):
def __init__(self, server_addr):
threading.Thread.__init__(self)
self.server = SimpleXMLRPCServer(server_addr)
self.server.register_multicall_functions()
self.server.register_function(add, 'add')
self.server.register_function(subtract, 'subtract')
self.server.register_function(multiply, 'multiply')
self.server.register_function(divide, 'divide')
def run(self):
self.server.serve_forever()
def run_server(host, port):
# server code
server_addr = (host, port)
server = ServerThread(server_addr)
server.start() # The server is now running
print "Server thread started. Testing the server..."
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Multithreaded multicall XMLRPC Server/Proxy')
parser.add_argument('--host', action="store", dest="host", default='localhost')
parser.add_argument('--port', action="store", dest="port", default=8000, type=int)
# parse arguments
given_args = parser.parse_args()
host, port = given_args.host, given_args.port
run_server(host, port)
并且打开iptables 上对应的TCP 8000端口:
iptables -A INPUT -p tcp --dport 8000 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 8000 -j ACCEPT
客户端代码如下:
host='198.98.XXX.XXX'
port=8000
proxy = xmlrpclib.ServerProxy("http://%s:%s/" %(host, port))
multicall = xmlrpclib.MultiCall(proxy)
multicall.add(7,3)
multicall.subtract(7,3)
multicall.multiply(7,3)
multicall.divide(7,3)
result = multicall()
print "7+3=%d, 7-3=%d, 7*3=%d, 7/3=%d" % tuple(result)
报错代码如下:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/xmlrpclib.py", line 998, in __call__
return MultiCallIterator(self.__server.system.multicall(marshalled_list))
File "/usr/lib/python2.7/xmlrpclib.py", line 1233, in __call__
return self.__send(self.__name, args)
File "/usr/lib/python2.7/xmlrpclib.py", line 1587, in __request
verbose=self.__verbose
File "/usr/lib/python2.7/xmlrpclib.py", line 1273, in request
return self.single_request(host, handler, request_body, verbose)
File "/usr/lib/python2.7/xmlrpclib.py", line 1301, in single_request
self.send_content(h, request_body)
File "/usr/lib/python2.7/xmlrpclib.py", line 1448, in send_content
connection.endheaders(request_body)
File "/usr/lib/python2.7/httplib.py", line 997, in endheaders
self._send_output(message_body)
File "/usr/lib/python2.7/httplib.py", line 850, in _send_output
self.send(msg)
File "/usr/lib/python2.7/httplib.py", line 812, in send
self.connect()
File "/usr/lib/python2.7/httplib.py", line 793, in connect
self.timeout, self.source_address)
File "/usr/lib/python2.7/socket.py", line 571, in create_connection
raise err
socket.error: [Errno 111] Connection refused