首页 > 编程语言 >Python Tornado实现WebSocket通讯

Python Tornado实现WebSocket通讯

时间:2023-08-28 18:44:16浏览次数:30  
标签:__ WebSocket Python self Tornado tornado import now port

以下实例有点像广播通讯,支持多个客户端连接

代码参考别人的,稍微做了一点点修改

服务器端 websocket_demo.py

 

# -*- coding: utf-8 -*-

from __future__ import unicode_literals, print_function
from datetime import datetime
import os

import tornado
from tornado.options import define, options
from tornado.web import RequestHandler
from tornado.websocket import WebSocketHandler

# 设置服务器端口
define("port", default=2222, type=int)


class IndexHandler(RequestHandler):
    def get(self):
        self.render("chat-client.html")


class ChatHandler(WebSocketHandler):
    users = set()  # 用来存放在线用户的容器

    def open(self):
        # 建立连接后添加用户到容器中
        self.users.add(self)

        # 向已在线用户发送消息
        for user in self.users:
            remote_ip, port = self.request.connection.context.address
            now = datetime.now().strftime("%H:%M:%S")
            user.write_message("[{}][{}:{}]-进入聊天室".format(now, remote_ip, port))

    def on_message(self, message):
        # 向在线用户广播消息
        now = datetime.now().strftime("%H:%M:%S")
        remote_ip, port = self.request.connection.context.address
        for user in self.users:
            user.write_message("[{}][{}:{}] {}".format(now, remote_ip, port, message))

    def on_close(self):
        # 用户关闭连接后从容器中移除用户
        now = datetime.now().strftime("%H:%M:%S")
        remote_ip, port = self.request.connection.context.address
        self.users.remove(self)
        for user in self.users:
            user.write_message("[{}][{}:{}]-离开聊天室".format(now, remote_ip, port))

    def check_origin(self, origin):
        return True  # 允许WebSocket的跨域请求


if __name__ == '__main__':
    tornado.options.parse_command_line()

    app = tornado.web.Application([
        (r"/", IndexHandler),
        (r"/chat", ChatHandler),
    ],
        static_path=os.path.join(os.path.dirname(__file__), "static"),
        template_path=os.path.join(os.path.dirname(__file__), "template"),
        debug=True
    )

    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.current().start()

 

 

 

客户端 template/chat-client.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>聊天室</title>
</head>
<body>
    <div id="contents" style="height:500px;overflow:auto;"></div>
    <div>
        <textarea id="msg"></textarea>
        <a href="javascript:;" onclick="sendMsg()">发送</a>
    </div>

<!-- jQuery -->
<script src="https://cdn.staticfile.org/jquery/3.3.1/jquery.min.js"></script>
<script type="text/javascript">
    var ws = new WebSocket("ws://127.0.0.1:2222/chat");
    ws.onmessage = function(e) {
        $("#contents").append("<p>" + e.data + "</p>");
    };
    function sendMsg() {
        var msg = $("#msg").val();
        ws.send(msg);
        $("#msg").val("");
    }
</script>
</body>
</html>

 

通讯效果,打开两个网页

 

 

 

标签:__,WebSocket,Python,self,Tornado,tornado,import,now,port
From: https://www.cnblogs.com/zhaoyingjie/p/17663157.html

相关文章

  • python3.8以及更高版本 编译pcl
    github https://github.com/strawlab/python-pcl1.安装Cython当前的Cython的版本如下 由于python-pcl代码仓已经是很老的代码了,没有人在维护,高版本的Cython会导致编译失败报错如下Cython.Compiler.Errors.CompileError:pcl/_pcl_180.pyx 使用Cython==0.29版本即可解决......
  • Python分享之redis(3)
    3、List操作redis中的List在在内存中按照一个name对应一个List来存储lpush(name,values)#在name对应的list中添加元素,每个新的元素都添加到列表的最左边r.lpush("list_name",2)r.lpush("list_name",3,4,5)#保存在列表中的顺序为5,4,3,2rpush(name,values)#同lpush,但每个新的元素......
  • Python查询Prometheus API
     #!/bin/python#-*-coding:utf-8-*-importpandasaspdimportrequests,time,redefgetcolumn(status):iffloat(status)<80:return"正常"#eliffloat(status)<2:#return"异常"else:......
  • Python5day
    今日内容概要基本运算符算术比较赋值逻辑成员身份流程控制(重要)——if  else elifwhile for等基本运算符:1.取模运算——又叫取余运算% 2.比较运算 == !=比较运算符及比较数据类型,又比较数据值3.赋值运算符  =python语法中除了有=号这种简单的赋值运算外,还支......
  • Windows环境下部署Python
    登录Python网站下载想要安装的版本并下载 下载完成后双击运行 点击installnow,等待安装进度条结束  此时Python已经安装完成,点击close即可。打开cmd,输入Python检验 发现并未正常进入Python,并弹出微软商店Python安装界面。查看win菜单,发现有Python安装后的启动程序......
  • python+playwright 学习-78 获取浏览器cookies
    前言playwright操作浏览器上的页面后,后续如果想结合其他的框架操作接口(如:requests),可以直接获取到浏览器的cookies。context.cookies()获取浏览器cookies使用示例fromplaywright.sync_apiimportsync_playwright,expectwithsync_playwright()asp:browser=......
  • 使用Python对HTTPS域名证书管理与验证
    随着业务的发展,很多域名都需要使用HTTPS。这就带来了一个新的问题:如何监控HTTPS域名证书的有效性。虽然证书不是一刹那过期的,但是也需要对其进行监控。了解其有效时间,并在过期前进行报警监控。要完成这些功能,所限就是要对证书进行解析。对证书解析可以使用python的OpenSSL库,以下为......
  • python dict(zip()) 用法
    下面是一篇关于 dict(zip()) 用法的博客文章:Python中的 dict(zip()) 是一种结合使用内置函数 dict() 和 zip() 的方法。zip() 函数用于从多个可迭代对象(如列表、元组、集合等)中提取元素,并将相应的元素配对在一起。配对的元素以元组的形式返回。dict() 函数接受一个由......
  • Python爬虫实战 - 模拟登录采集数据
    在进行数据采集时,有些网站需要进行登录才能获取到所需的数据。本文将介绍如何使用Python爬虫进行模拟登录,以便采集网站的数据。我们提供了完善的方案和代码示例,让你能够轻松操作并获取所需的数据。使用Python爬虫模拟登录网站采集数据价值:数据获取:通过模拟登录,你可以通过网站的登录......
  • 批量python爬虫采集性能优化之减少网络延迟的方法
    今天,我们将一起探讨批量爬虫采集的性能优化,特别关注减少网络延迟的方法。网络延迟是爬虫程序中一个常见的性能瓶颈,通过优化网络延迟,我们可以提高爬虫程序的采集速度和效率。让我们一起来看看如何实现这一目标。1.使用异步请求传统的同步请求方式会导致爬虫程序在等待服务器响应时浪......