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

发布于 2022-09-01 16:27:48 字数 2461 浏览 9 评论 0

py:

import logging
import os.path
import uuid
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import tornado.websocket


def send_message(message):
    for handler in ChatSocketHandler.socket_handlers:
        try:
            handler.write_message(message)
        except:
            logging.error('Error sending message', exc_info=True)


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


class ChatSocketHandler(tornado.websocket.WebSocketHandler):
    socket_handlers = set()
    num = 0
    def open(self):
        ChatSocketHandler.num = ChatSocketHandler.num + 1
        name = "name:%s" % ChatSocketHandler.num
        ChatSocketHandler.socket_handlers.add(self)
        send_message('A new user has entered the chat room.')

    def on_close(self):
        ChatSocketHandler.num = ChatSocketHandler.num - 1
        ChatSocketHandler.socket_handlers.remove(self)
        send_message('A user has left the chat room.')

    def on_message(self, message):
        send_message(message)


def main():
    application = tornado.web.Application([
        ('/', MainHandler),
        ('/new-msg/socket', ChatSocketHandler)
    ], debug=True)
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(8000)
    tornado.ioloop.IOLoop.instance().start()

if __name__ == '__main__':
    main()

html:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>{{title}}</title>
</head>
<body>
hello world


<div><button id="do">send</button></div>




<div id="con"></div>


</body>
<script src="http://jinri.info/common/js/jquery.min.js"></script>


<script>
    $(function() {
        $('#do').click(function() {
            sendMessage()
        })
        longMesaage()
    })
    //发送信息
    function sendMessage() {
        var url = "http://to.com/new/message"
        $.post(url, {con:'hello'});
    }
    //长连接,查看是否有新消息
    function longMesaage() {
        var url = "http://to.com/new/get"
        $.get(url, function(data) {
            $('#con').append("<div>"+data+"</div>");
            longMesaage()
        })
    }
</script>


</html>

这个一个简单的demo
我想改进下
页面上设置好用户名,然后每次发言的时候带上用户名
这个应该怎么改?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

晒暮凉 2022-09-08 16:27:48

用session。或者用cookie

#!/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()


上面是我写得demo,就是可以用cookie的。分成两部来做,第一步是登录,这时候把nickname存到cookie时,第二步当websocket open时,把cookie里的nickname取出来吧。

千里故人稀 2022-09-08 16:27:48

GoEasy实时Web推送,支持后台推送和前台推送两种:后台推送可以选择Java SDK、 Restful API支持所有开发语言;前台推送:JS推送。无论选择哪种方式推送代码都十分简单(10分钟可搞定)。由于它支持websocket 和polling两种连接方式所以兼顾大多数主流浏览器,低版本的IE浏览器也是支持的。另外GoEasy针对前台推送采用OTP (one-time-password)方式加密方式,能有效杜绝他人通过在页面上获取 appkey的方式,进行非法操作,十分安全!GoEasy多机房部署,支持全球推送。个人觉得十分值得推荐: goeasy.io

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文