-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathrpcserver.py
80 lines (66 loc) · 2.4 KB
/
rpcserver.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# coding:utf-8
import socket, threading
from xmlrpc.server import SimpleXMLRPCServer
class RPCServer(object):
"""
export_functions = []
export_functions.append((func1, "add"))
export_functions.append((func2, "sub"))
"""
def __init__(self, port=9999, export_functions=[], export_instance=None, name='RPC Server'):
self._port = port
self._started = False
self._export_functions = export_functions
self._export_instance = export_instance
self._name = name
def __del__(self):
self.stop()
@staticmethod
def _rpc_server_thread(rpc_server):
rpc_server._server.serve_forever()
def stop(self):
if self._started:
self._started = False
self._server.shutdown()
self._server.server_close()
def start(self, blocking=True):
if not self._started:
try:
self._server = SimpleXMLRPCServer(('127.0.0.1', self._port), logRequests=False, allow_none=True)
except socket.error as e:
pass
else:
self._server.register_multicall_functions()
for func in self._export_functions:
self._server.register_function(func[0], func[1])
if self._export_instance is not None:
self._server.register_instance(self._export_instance)
self._started = True
if not blocking:
self._thread = threading.Thread(target=RPCServer._rpc_server_thread, args=(
self,), name='%s thread' % self._name)
self._thread.daemon = True
self._thread.start()
else:
RPCServer._rpc_server_thread(self)
return self._started
def get_listening_port(self):
return self._port
def is_started(self):
return self._started
def wait_stopped(self):
if hasattr(self, '_thread'):
while self._thread.is_alive():
self._thread.join(1)
if __name__ == '__main__':
def func1(a, b):
return a + b
def func2(a, b):
return a - b
functions = []
functions.append((func1, 'add'))
functions.append((func2, 'sub'))
server = RPCServer(80, export_functions=functions)
print('RPC server created (not started yet)')
server.start(False)
server.wait_stopped()