python使用websocket实现多端数据同步,多个websocket同步消息,断开链接自动清理

我使用的是flask_sock这个模块,我的使用场景是:可以让数据多端实时同步。在游戏控制后台和游戏选手的ipad上都可以实时调整角色的技能和点数什么的,所以需要这样的一个功能来实现数据实时同步。

下面是最小的demo案例:

python 复制代码
from flask import Flask
from flask_sock import Sock

app = Flask(__name__)
sock = Sock(app)
# 创建全局的ws对象数组
ws_list = []
ws_closed = []


@app.route('/')
def index():
    return "你好,世界"


@app.route('/ws')
def websocket():
    return """
    <!doctype html>
    <html>
      <head>
        <title>Flask-Sock Demo</title>
      </head>
      <body>
        <h1>Flask-Sock Demo</h1>
        <div id="log"></div>
        <br>
        <form id="form">
          <label for="text">Input: </label>
          <input type="text" id="text" autofocus>
        </form>
        <script>
          const log = (text, color) => {
            document.getElementById('log').innerHTML += `<span style="color: ${color}">${text}</span><br>`;
          };
    
          const socket = new WebSocket('ws://' + location.host + '/echo');
          socket.addEventListener('message', ev => {
            log('<<< ' + ev.data, 'blue');
          });
          document.getElementById('form').onsubmit = ev => {
            ev.preventDefault();
            const textField = document.getElementById('text');
            log('>>> ' + textField.value, 'red');
            socket.send(textField.value);
            textField.value = '';
          };
        </script>
      </body>
    </html>
    """


def handle_sync(data, self):
    # 同步各端ws消息
    for ws in ws_list:
        if not ws.connected:
            ws_closed.append(ws)
        elif data and ws != self:
            ws.send(data)
    # 删除已断开的链接
    for cl in ws_closed:
        ws_list.remove(cl)
    ws_closed.clear()
    print(f"live num: {len(ws_list)}, done num: {len(ws_closed)}")


@sock.route('/echo')
def echo(self):
    global ws_list
    ws_list.append(self)
    # 同步消息和关闭ws clear
    handle_sync(None, self)
    while True:
        print(f"global ws list: {len(ws_list)}")
        # 判断是断开连接还是还在链接
        data = self.receive()
        self.send(data)
        # 同步消息和关闭ws clear
        handle_sync(data, self)


if __name__ == '__main__':
    app.run(host="0.0.0.0", port=8989)

当有ws链接进来的时候,有一个全局的数组存储所有的 ws_list 存储活着的websocket。ws_closed用来存储断开连接的ws信息,当每次建立新的链接或者一个ws收到消息,就检测每个链接的状态,并将信息同步到活着的所有ws链接。

程序启动之后,访问:http://192.168.110.196:8989/ws

就能建立一个ws链接,我创建了三个链接,当我在第一个上面发送消息的时候,后面两个就能将消息同步展示出来。任意一个页面发送数据,其他页面都会实时同步所有消息。

效果:

同步页面:

相关推荐
andxe8 小时前
安科士AndXe 400G QSFP-DD LR8光模块芯片架构与品控体系解析
网络·光模块·光通信
去码头整点薯条988 小时前
网络实验报告10
网络
坚定的共产主义生产设备永不宕机9 小时前
路由协议OSPF进阶一篇讲全
网络
碎碎念_49210 小时前
以太网技术、VLAN、STP详解
网络·stp·vlan
hbugs00110 小时前
【案例分享】全网首个华三数据中心流量可视化实验,基于EVE-NG V7平台
网络·网络协议·安全·devops·eve-ng
不会C语言的男孩11 小时前
第 13 章 网络与分布式系统基础
网络
山东穆柯传感器12 小时前
安全触边损坏如何维修及更换配件
网络·安全
huainingning12 小时前
华三ACL单向TCP互通组网-通过Established状态回包实现
运维·网络·tcp/ip
Johnstons12 小时前
游戏网络测试怎么做?从延迟到丢包,一套完整的游戏弱网测试方案
网络·游戏·php
Rocket-Luo12 小时前
谈谈企业中的网络安全
网络·安全·web安全