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

效果:

同步页面:

相关推荐
圆圆讲门店8 小时前
挑选同城获客服务机构时需要考量的核心因素都有哪些?
大数据·网络·人工智能·python
制造业的搬运工9 小时前
扫地机器人主板 PCB 选型:深圳线路板与普通板的 8 项工艺指标对比与参数清单
网络·科技·制造·科普·pcb工艺
发光小北9 小时前
五口百兆pn优先交换机现场应用能遇到哪些问题?
网络协议
XiaoMaqqqq11 小时前
目前知名的IP驱动产业新场景新工具有哪些
网络·python·网络协议·tcp/ip
李永奉11 小时前
中科蓝讯SDK开发-BT897X、BT891X、AB573X、AB572X 系列 触摸按键提示音功能实现
网络·单片机·嵌入式硬件·mcu·物联网
ShineWinsu11 小时前
对于ProtoBuffer:ProtoBuffer的介绍以及安装
linux·网络·google·协议·序列化·反序列化·protobuffer
Eddyp12 小时前
避开溢价!艾默生 TREX2 手操器省钱选型攻略
网络·其他·百度·微信·微信公众平台·新浪微博
FlightYe12 小时前
视界原理之2D视频(二):视频文件里有什么
android·linux·网络·c++·ffmpeg·音视频·aac
2601_9672127213 小时前
国际品质电源轨道系统供应商技术评估维度
大数据·网络·经验分享
acrel714 小时前
化工企业能源管理体系下智能化技术实践与探索
网络·人工智能