SocketIo广播模式简单使用

基于Python的SocketIo搭建广播式通讯服务。统一的服务端,客户端可以为Python或HTML网页

话不多说,直接干货!

  1. 基础依赖
pip install python-socketio==5.8.0
pip install python-engineio==4.5.1
pip install websocket==0.2.1
pip install websocket-client==1.6.1
pip install eventlet==0.33.3
pip install requests==2.31.0
  1. 服务端
import random

import socketio

# 创建 Socket.IO 服务器实例
# cors_allowed_origins解决跨域问题
sio = socketio.Server(cors_allowed_origins='*')
app = socketio.WSGIApp(sio)


# 定义事件处理器
# 有客户端连接时触发
@sio.event
def connect(sid, environ):
    print(f'Client connected: {sid}')


# 有客户端断开时触发
@sio.event
def disconnect(sid):
    print(f'Client disconnected: {sid}')

# 自定义事件
@sio.on('myEvent')
def my_event(sid, data):
    print(f'Client {sid} Send message: {data}')
    sio.emit('clientEvent', data)


def server_process():
    while True:
        sio.emit('response', f'随机数:{random.randint(1, 50)}')
        sio.sleep(1)


# 启动服务器
if __name__ == '__main__':
    import eventlet
    import eventlet.wsgi

    # 启动广播任务
    sio.start_background_task(target=server_process)

    # 使用 eventlet 作为后端服务器
    eventlet.wsgi.server(eventlet.listen(('', 10240)), app)
  1. Python客户端

写法一:单独py文件

import socketio

sio = socketio.Client()


@sio.event
def connect():
    print('Connected to server')


@sio.event
def disconnect():
    print('Disconnected from server')


@sio.on('response')
def response_event(data):
    print(f'Server Send Message: {data}')


sio.connect('http://127.0.0.1:10240')
sio.emit('myEvent', '我从客户端发来:111')

写法二:封装成类

import socketio


class SocketIOClient:
    def __init__(self):
        self.sio = socketio.Client()

        @self.sio.event
        def connect():
            print('Connected to server')

        @self.sio.event
        def disconnect():
            print('Disconnected from server')

    # 此处的callback可以有多个,对应绑定多个Socketio的事件方法
    # 事件方法需要用 @self.sio.on 装饰器来来标注
    @staticmethod
    def on_message(self, callback):
        @self.sio.on('response')
        def _on_message(data):
            callback(data)

    def connect(self, url):
        self.sio.connect(url)

    def disconnect(self):
        self.sio.disconnect()

    def send_message(self, event, message):
        self.sio.emit(event, message)

使用:

# 定义一个回调函数,用来绑定Socketio事件方法
def process(data):
    print(f'Server Send Message: {data}')


sio_client = SocketIOClient()
sio_client.on_message(sio_client, process)
sio_client.connect('http://127.0.0.1:10240')
sio_client.send_message('myEvent', '我从客户端发来:111')
  1. 网页客户端
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Test-WebSocketIoClient</title>
    <script type="text/javascript" src="../fileJs/socket.io.min.js"></script>
</head>
<body>
<div id="div_text">Message div</div>
<input type="button" onclick="WebSocketIoClient()" value="连接">
<input type="button" onclick="closeSocket()" value="断开">
<input type="button" onclick="sendMsg()" value="发送消息">
<script>
    let socket
    
    function WebSocketIoClient() {
        console.log('asd')
        let text = document.getElementById("div_text");
        socket = io.connect('http://127.0.0.1:10240', {
            timeout: 300000,
            reconnectionDelayMax: 1000,
            reconnectionDelay: 500
        })
        socket.on('connect', () => {
            console.log('客户端已连接!')
        })
        socket.on('disconnect', () => {
            console.log('客户端已断开连接!')
        })
        socket.on('response', msg => {
            console.log(msg)
            text.innerHTML = msg
        })
    }

    function closeSocket() {
        socket.close()
    }

    function sendMsg() {
        socket.emit('myEvent', '我从客户端发来:111')
    }
</script>

</body>
</html>

使用网页客户端需要下载socket.io.min.js。下载地址: GitHub-Socket.io.min.js

OK~

最后的最后:希望文章可以帮到大家,路过大神不喜勿喷,我们共同学习,加油吧!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值