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”.