I needed a simple python JSON server executing in its own thread but that was easily extensible. Let’s get right to the base class code (or super class for those who build down).
#! /usr/bin/python import threading import jsonrpclib import jsonrpclib.SimpleJSONRPCServer class JsonServerThread (threading.Thread): def __init__(self, host, port): threading.Thread.__init__(self) self.daemon = True self.stopServer = False self.host = host self.port = port self.server = None def _ping(self): pass def stop(self): self.stopServer = True jsonrpclib.Server("http://" + str(self.host) + ":" + str(self.port))._ping() self.join() def run(self): self.server = jsonrpclib.SimpleJSONRPCServer.SimpleJSONRPCServer((self.host, self.port)) self.server.logRequests = False self.server.register_function(self._ping) self.addMethods() while not self.stopServer: self.server.handle_request() self.server = None # defined class definitions def addMethods(self): pass
So the idea is simple, Derive a new class from this and implement the addMethods method and the methods themselves.
#! /usr/bin/python import jsonServer class JsonInterface(jsonServer.JsonServerThread): def __init__(self, host, port): jsonServer.JsonServerThread.__init__(self, host, port) self.directory = directory def addMethods(self): self.server.register_function(self.doOneThing) self.server.register_function(self.doAnother) def doOneThing(self, obj): return obj def doAnother(self): return "why am I doing something else?"
In the derived class, implement the methods and register them in addMethods. That is all. Now we can worry simply about implementation. Be aware of any threading synchronization of exception handling. Jsonrpclib takes care of exception handling as well and converts it into a JSON exception.
One last item of note. In the base class, the stop method is interesting. Since handle_request() is a blocking call in the thread, we need to set the “stop” flag and make a simple request. The _ping method does this for us. Then we join on the thread waiting for it to end gracefully.
The jsonrpclib is a very useful library and well done. By the way, this example is for Python 2.7. On Ubuntu 14.04, you can install this using “apt-get install python-jsonrpclib”.