tornado websocket 怎么区别每个连接的用户

2025-03-22 04:37:25
推荐回答(1个)
回答1:

#!/usr/bin/env python
#coding:utf-8
# Author : tuxpy
# Email : q8886888@qq.com.com
# Last modified : 2015-08-13 15:08:17
# Filename : chat.py
# Description :
from __future__ import print_function

from tornado import web, websocket, ioloop, options, escape

from tornado.options import define, options
from tornado.httpserver import HTTPServer

define('port', default = 8888, help = 'run on the given port', type = int)

class IndexHandler(web.RequestHandler):
def get(self):
self.render('index.html')

class ChatHandler(websocket.WebSocketHandler):
all_client = set()
def open(self):
nickname = escape.utf8(self.get_secure_cookie('nickname'))
if not nickname:
raise HTTPError(400)
print('当前连接得是', nickname)
self.nickname = nickname
ChatHandler.all_client.add(self)

def on_close(self):
ChatHandler.all_client.remove(self)

def on_message(self, message):
message = "%s 说: %s" % (self.nickname,
escape.utf8(message))
for client in ChatHandler.all_client:
client.write_message(message)

class LoginHandler(web.RequestHandler):
def post(self):
nickname = self.get_body_argument('nickname', '').strip()
if not nickname:
raise web.HTTPError(400)

self.set_secure_cookie('nickname', nickname)

class ChatApplication(web.Application):
def __init__(self):
handlers = [
(r'/', IndexHandler),
(r'/login', LoginHandler),
(r'/chat', ChatHandler),
]

settings = dict(
cookie_secret = 'abc',
template_path = 'template',
static_path = 'static',
debug = True,
)

web.Application.__init__(self, handlers, **settings)

if __name__ == "__main__":
options.parse_command_line()
app = ChatApplication()
http_server = HTTPServer(app)
http_server.listen(options.port)
ioloop.IOLoop.instance().start()