master
1
2# pip install geojson tornado pyzmq
3
4import tornado.httpserver
5import tornado.websocket
6import tornado.ioloop
7import tornado.web
8
9import zmq
10import zmq.eventloop.ioloop
11from zmq.eventloop.zmqstream import ZMQStream
12zmq.eventloop.ioloop.install()
13
14class MyStaticFileHandler(tornado.web.StaticFileHandler):
15 def set_extra_headers(self, path):
16 # Disable cache
17 self.set_header('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0')
18
19class WSHandler(tornado.websocket.WebSocketHandler):
20
21 def initialize(self, zmq_ctx, zmq_sub):
22 self.sub = zmq_ctx.socket(zmq.SUB)
23 self.sub.connect(zmq_sub)
24 self.sub.setsockopt(zmq.SUBSCRIBE, "")
25 self.stream = ZMQStream(self.sub)
26
27 def push(msg):
28 if self.ws_connection is not None:
29 self.write_message(msg[0])
30
31 self.stream.on_recv(push)
32
33 def open(self):
34 print 'new connection'
35 #self.write_message("Hello World")
36
37 def on_message(self, message):
38 # TODO get message that sets SUBSCRIBE options
39 print 'message received %s' % message
40
41 def on_close(self):
42 print 'connection closed'
43 self.stream.close()
44
45if __name__ == "__main__":
46
47 ws_port = 8888
48
49 zmq_sub = 'tcp://127.0.0.1:5000'
50 zmq_ctx = zmq.Context()
51
52 application = tornado.web.Application([
53 (r'/ws', WSHandler, dict(zmq_ctx=zmq_ctx, zmq_sub=zmq_sub)),
54 (r'/(.*)', MyStaticFileHandler,{'path':"./static/"}),
55 #(r'/(.*)', tornado.web.StaticFileHandler,{'path':"./static/"}),
56 ])
57 http_server = tornado.httpserver.HTTPServer(application)
58 http_server.listen(ws_port)
59 zmq.eventloop.ioloop.IOLoop.instance().start()