基于Python的SocketIo搭建广播式通讯服务。统一的服务端,客户端可以为Python或HTML网页
话不多说,直接干货!
- 基础依赖
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
- 服务端
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)
- 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')
- 网页客户端
<!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~
最后的最后:希望文章可以帮到大家,路过大神不喜勿喷,我们共同学习,加油吧!!!!