Skip to content

Instantly share code, notes, and snippets.

@c4pt0r
Created July 21, 2012 07:31
Show Gist options
  • Save c4pt0r/3154974 to your computer and use it in GitHub Desktop.
Save c4pt0r/3154974 to your computer and use it in GitHub Desktop.
#encoding=utf-8
#simple http/sockJS comet server written by huangdx
import tornado.ioloop
import tornado.web
import sockjs.tornado
import json
class TestHandler(tornado.web.RequestHandler):
def get(self):
self.render('index.html')
class StatusHandler(tornado.web.RequestHandler):
def get(self):
online = len(CometConnection.user_map.items())
self.write(json.dumps({'online':online}))
class PostHandler(tornado.web.RequestHandler):
def post(self):
data = self.get_argument('data', '')
users = self.get_argument('users','')
is_all = self.get_argument('is_all', '')
if is_all != '1':
users = users.split(',')
clients = [clients for uname, clients in CometConnection.user_map.items() if uname in users]
CometService.broadcast(clients, data)
else:
CometService.broadcast(CometConnection.user_map.values(), data)
class CometConnection(sockjs.tornado.SockJSConnection):
user_map = dict()
def on_open(self, info):
pass
def on_message(self, message):
data = json.loads(message)
username = data['user']
cmd = data['cmd']
if cmd == 'sub':
if username in self.user_map.keys():
self.user_map[username].close()
self.user_map[username] = self
print username, 'subscribed!'
def on_close(self):
print 'on close'
for uname, client in self.user_map.items():
if client == self:
del self.user_map[uname]
CometService = sockjs.tornado.SockJSRouter(CometConnection, '/comet')
if __name__ == '__main__':
import logging
logging.getLogger().setLevel(logging.DEBUG)
app = tornado.web.Application(
[(r"/post", PostHandler),
(r"/status", StatusHandler),
(r'/test', TestHandler)] + CometService.urls
)
app.listen(18081)
tornado.ioloop.IOLoop.instance().start()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment