master
Raw Download raw file
 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()