import SocketServer, threading, json
conn = {}
conn_lock = threading.Lock()
class ThreadingServer(SocketServer.ThreadingMixIn,\
SocketServer.TCPServer):
allow_reuse_address = True
class Handler(SocketServer.StreamRequestHandler):
def handle(self):
print "A new client connected", self.client_address
msg = json.read_stream(self.rfile)
if "!name" in msg:
name = msg["!name"]
wlock = threading.Lock()
conn_lock.acquire()
conn[name] = (wlock, self.wfile)
conn_lock.release()
print "Client registered (%s)" % name
reply = {"ok": u"registered"}
self.wfile.write(json.write(reply))
self.wfile.flush()
else:
reply = {"err": u"invalid name"}
self.wfile.write(json.write(reply))
return
self.handle_connection(name)
def handle_connection(self, name):
while True:
try:
msg = json.read_stream(self.rfile)
except:
msg = {"!close": True}
if "!close" in msg:
print "Client exits (%s): %s" %\
(name, self.client_address)
conn_lock.acquire()
if name in conn:
del conn[name]
conn_lock.release()
break
elif "!dst" in msg:
wfile = None
conn_lock.acquire()
if msg["!dst"] in conn:
wlock, wfile = conn[msg["!dst"]]
conn_lock.release()
if wfile:
wlock.acquire()
try:
wfile.write(json.write(msg))
wfile.flush()
finally:
wlock.release()
server = ThreadingServer(('', 9000), Handler)
print "JSON gateway is running!"
print "Waiting for new clients..."
server.serve_forever()