58 lines
1.8 KiB
Python
58 lines
1.8 KiB
Python
#!/usr/bin/python
|
|
# -*- coding: utf-8 -*-
|
|
|
|
import SocketServer
|
|
import pickle
|
|
|
|
HOST = "localhost"
|
|
PORT = 8000
|
|
|
|
class RPCServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
|
|
# The object_to_proxy member should be set to the object we want
|
|
# methods called on. Unfortunately, we can't do this in the constructor
|
|
# because the constructor should not be overridden in TCPServer...
|
|
|
|
daemon_threads = True
|
|
|
|
class RPCHandler(SocketServer.StreamRequestHandler):
|
|
def handle(self):
|
|
in_channel = pickle.Unpickler(self.rfile)
|
|
out_channel = pickle.Pickler(self.wfile, protocol=2)
|
|
while True:
|
|
try:
|
|
name, args, kwargs = in_channel.load()
|
|
print 'got %s %s %s' % (name, args, kwargs)
|
|
except EOFError:
|
|
# EOF means we're done with this request.
|
|
# Catching this exception to detect EOF is a bit hackish,
|
|
# but will work for a quick demo like this
|
|
break
|
|
try:
|
|
method = getattr(self.server.object_to_proxy, name)
|
|
result = method(*args, **kwargs)
|
|
except Exception, e:
|
|
out_channel.dump(('Error',e))
|
|
else:
|
|
out_channel.dump(('OK',result))
|
|
|
|
class MyHandlerInstance(object):
|
|
def echo(self, data):
|
|
'''Method for returning data got from client'''
|
|
return 'Server responded: %s' % data
|
|
|
|
def div(self, dividend, divisor):
|
|
'''Method to divide 2 numbers'''
|
|
return dividend/divisor
|
|
|
|
def is_computer_on(self):
|
|
return True
|
|
|
|
if __name__ == '__main__':
|
|
rpcserver = RPCServer((HOST, PORT), RPCHandler)
|
|
rpcserver.object_to_proxy = MyHandlerInstance()
|
|
try:
|
|
rpcserver.serve_forever()
|
|
except KeyboardInterrupt:
|
|
print 'Exiting...'
|
|
rpcserver.server_close()
|