TestChatServer/py/chatroom.py (49 lines of code) (raw):
#!/usr/bin/env python
#
# Copyright 2012 Square Inc.
# Portions Copyright (c) 2016-present, Facebook, Inc.
# All rights reserved.
#
# This source code is licensed under the license found in the
# LICENSE-examples file in the root directory of this source tree.
#
import tornado
import tornado.web
import tornado.websocket
import tornado.options
import os
import json
import uuid
import argparse
import logging
logger = logging.getLogger('gateway')
args = None
def parse_args():
global args
static_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'static'))
parser = argparse.ArgumentParser(description='Gateway server')
parser.add_argument('-v', '--verbose', help='verbose logging', action='store_true')
parser.add_argument('-s', '--static-path', help='path for static files [default: %(default)s]', default=static_path)
parser.add_argument('-p', '--listen-port', help='port to listen on [default: %(default)s]', default=9000, type=int, metavar='PORT')
parser.add_argument('-i', '--listen-interface', help='interface to listen on. [default: %(default)s]', default='0.0.0.0', metavar='IFACE')
args = parser.parse_args()
connections = set()
class ChatHandler(tornado.websocket.WebSocketHandler):
def open(self):
connections.add(self)
return None
def on_message(self, msg):
for c in connections:
if c is self:
continue
c.write_message(msg)
def on_close(self):
connections.remove(self)
def main():
global logger
#tornado.options.parse_command_line()
parse_args()
if args.verbose:
tornado.options.enable_pretty_logging()
logger = logging.getLogger()
logger.setLevel(logging.INFO)
application = tornado.web.Application([
(r"/chat", ChatHandler),
(r"/(.*)", tornado.web.StaticFileHandler, {"path": args.static_path, "default_filename":'index.html'}),
],
)
print "Listening on %s:%s" % (args.listen_interface, args.listen_port)
application.listen(args.listen_port, args.listen_interface)
tornado.ioloop.IOLoop.instance().start()
if __name__ == "__main__":
main()