Python编程:tornado实现WebSocket通讯

简介: 以下实例有点像广播通讯,支持多个客户端连接 代码参考别人的,稍微做了一点点修改 服务器端 websocket_demo.py

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

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

服务器端 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>

通讯效果,打开两个网页

7.png

8.png

参考 :

Python Tornado之WebSocket聊天室

            </div>
目录
相关文章
|
人工智能 BI 知识图谱
2019年 团体程序设计天梯赛——题解集
⭐L1一阶题 (虽然比较基础但是是很重要的一部分,且一些题目有一定难度哦!) ⭐L1-057 PTA使我精神焕发 (5分) 本题题目链接 以上是湖北经济学院同学的大作。本题就请你用汉语拼音输出这句话。 输入格式: 本题没有输入。
231 0
 2019年 团体程序设计天梯赛——题解集
|
大数据 Windows Linux
java.net.UnknownHostException: master
1:如果你报这个错误,第一反应应该是本地的host文件没有配置服务器名称和对应的ip地址,这个反应就对了。贴一下错误和解决方法: 1 java.net.UnknownHostException: master 2 at java.
4383 0
|
SQL 算法 安全
看完你就应该能明白的悲观锁和乐观锁
Java 按照锁的实现分为乐观锁和悲观锁,乐观锁和悲观锁并不是一种真实存在的锁,而是一种设计思想,乐观锁和悲观锁对于理解 Java 多线程和数据库来说至关重要,那么本篇文章就来详细探讨一下这两种锁的概念以及实现方式。
168 0
看完你就应该能明白的悲观锁和乐观锁
Kam
|
Java 数据库连接 mybatis
Idea中@Autowire提示:Could not autowire
Idea中@Autowire提示:Could not autowire
Kam
333 0
|
SQL JavaScript Java
一份语言选择指南带你玩数据科学,选出你心中支持的语言
数据科学是一个热门的领域,本文介绍数据科学家目前使用的一些热门编程语言,主要是从通用性、性能等方面分析,想入门的或行业研究者可以参考并发表一下自己的观点哦。
4456 0
|
Swift C++
Swift-进阶 10:可选类型Optional & Equatable+Comparable协议
Swift-进阶 10:可选类型Optional & Equatable+Comparable协议
372 0
Swift-进阶 10:可选类型Optional & Equatable+Comparable协议
|
计算机视觉 Python
PIL.Image.open和cv2.imread的比较与相互转换
PIL.Image.open读入的是RGB顺序,而opencv中cv2.imread读入的是BGR通道顺序 。cv2.imread会显示图片更蓝一些。
487 0
PIL.Image.open和cv2.imread的比较与相互转换
|
8月前
|
存储 缓存 Java
Java交换map的key和value值
在Java中,直接交换`Map`的key和value是不允许的,因为key是唯一的且不可变。不过,可以通过创建新`Map`实现交换:将原`Map`的value作为新key,key作为新value。注意,如果原`Map`有重复value或null,需额外处理。以下是一个代码示例,展示了如何在value唯一且非null的情况下交换`Map`的key和value。对于重复value或null值的情况,可以使用`List`存储多个key或忽略null值。在实际应用中,`Map`常用于缓存、配置管理、数据库结果映射等多种场景。
104 1
|
8月前
|
存储 缓存 网络协议
ARP欺骗与攻击原理
ARP欺骗与攻击原理
232 0
|
Java PHP
支付宝一码多付接口开发指南
1.接口说明   接口介绍     该方案适用于通过一个二维码,可以使用多种第三方支付,常见的一码多付产品:收钱吧     使用场景流程,申请条件,产品费率点击【更多】查看   常见问题     Q:怎么判断自己的需求可以使用一码多付方案?     A:一般都是想使用一个固定的二维码,可以使用...
1454 0

热门文章

最新文章

推荐镜像

更多