Python利用Socket.IO实现消息实时推送
最新推荐文章于 2025-10-16 13:21:24 发布
原创
最新推荐文章于 2025-10-16 13:21:24 发布·1.5w 阅读
38·
最新推荐文章于 2025-10-16 13:21:24 发布·1.5w 阅读·
8
·
8
38·CC 4.0 BY-SA版权
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
文章标签:
Python利用Socket.IO实现消息实时推送
即时通讯简介
即时通讯(Instant Messaging)是一种基于互联网的即时交流消息的业务
类型:
在线push:适用于web页面和app,自己构建的IM服务器(socket.io框架,大佬可以自己封装socket)
离线push:适用于app,成本高,大厂可以自己用服务器做业务,小厂可以用第三方IM服务商:网易云信,融云,环信
传统的推送实现
- 轮询:客户端定时发出HTTP请求,查询服务器有没有新消息,效率低下,消耗资源
- Comet:基于长连接,长轮询,等等服务器推送数据。消耗资源
WebSocket协议
- 简介:在单个TCP连接上进行全双工通信的协议,使用ws或者wss统一的资源标识符,例如:ws://example.com/wsapi
WebSocket默认使用80端口,在TLS上默认使用443端口。 - 优点:
较小的控制开销,数据包大量减少;更强的实时性,服务器可以随时主动给客户端发送数据,
保持连接状态,更好的二进制支持
支持扩展,没有同源限制,可以发送文本,也可发送二进制数据… - 协议特点:
WebSocket是独立的、建立在TCP之上的协议,只需一次握手 - 一个栗子:
客户端发送请求:
GET / HTTP/1.1Upgrade: websocketConnection: UpgradeHost: example.comOrigin: http://example.comSec-WebSocket-Key: sN9cRrP/n9NdMgdcy2VJFQ==Sec-WebSocket-Version: 13服务器响应:
HTTP/1.1 101 Switching ProtocolsUpgrade: websocketConnection: UpgradeSec-WebSocket-Accept: fFBooB7FAkLlXgRSz0BT3v4hq5s=Sec-WebSocket-Location: ws://example.com/- Connection必须设置Upgrade,表示客户端希望连接升级
- Upgrade字段必须设置Websocket,表示希望升级到Websocket协议。
- Origin字段是可选的,通常用来表示在浏览器中发起此Websocket连接所在的页面,类似于Referer。但是,与Referer不同的是,Origin只包含了协议和主机名称。
- Sec-WebSocket-Key是随机的字符串,服务器端会用这些数据来构造出一个SHA-1的信息摘要。把“Sec-WebSocket-Key”加上一个特殊字符串“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”,然后计算SHA-1摘要,之后进行BASE-64编码,将结果做为“Sec-WebSocket-Accept”头的值,返回给客户端。如此操作,可以尽量避免普通HTTP请求被误认为Websocket协议。
- 其他一些定义在HTTP协议中的字段,如Cookie等,也可以在Websocket中使用。
Socket.IO框架
简介:Socket.IO 本是一个面向实时 web 应用的 JavaScript 库,现在已成为拥有众多语言支持的Web即时通讯应用的框架。
Socket.IO 不等价于 WebSocket,WebSocket只是Socket.IO实现即时通讯的其中一种技术依赖优点:Socket.IO 会自动选择合适双向通信协议,仅仅需要程序员对套接字的概念有所了解。
缺点:Socket.io要求客户端与服务器端均须使用该框架。
使用方法
1.创建服务器
# 安装pip install python-socketio# 使用协程的方式运行socketio服务器import evenleteventlet.monkey_patch()import socketioimport eventlet.wsgi# 打包称WSGI应用,使用WSGI服务器托管运行sio= socketio.Server(async_mode='eventlet')# 指明启动模式app= socketio.Middleware(sio)eventlet.wsgi.server(eventlet.listen(('',8000)), app)- 2.事件处理
简介:不同于HTTP服务的编写方式,SocketIO服务编写不再以请求Request和响应Response来处理,而是对收发的数据以消息(message)来对待,收发的不同类别的消息数据又以事件(event)来区分。
"""定义事件处理方法:connect 为特殊事件,当客户端连接后自动执行disconnect 为特殊事件,当客户端断开连接后自动执行connect、disconnect与自定义事件处理方法的函数传入参数不同"""@sio.on('connect')defon_connect(sid, environ):""" 与客户端建立好连接后被执行 :param sid: string sid是socketio为当前连接客户端生成的识别id :param environ: dict 在连接握手时客户端发送的握手数据(HTTP报文解析之后的字典) """pass@sio.on('disconnect')defon_disconnect(sid):""" 与客户端断开连接后被执行 :param sid: string sid是断开连接的客户端id """pass# 以字符串的形式表示一个自定义事件,事件的定义由前后端约定@sio.on('my custom event')defmy_custom_event(sid, data):""" 自定义事件消息的处理方法 :param sid: string sid是发送此事件消息的客户端id :param data: data是客户端发送的消息数据 """pass"""发送事件消息"""# 群发sio.emit('my event',{'data':'foobar'})# 指定用户发送sio.emit('my event',
5 条评论您还未登录,请先登录后发表或查看评论
5 条评论

D__pythoner回复DLAM-小叮当2020.12.15函数名可以随便起。sio.on里面的字符串是事件名称,除了connect和disconnect是socketio服务自定的特殊事件,其他的自定义的事件名称可以随便起名字
最低0.47元/天 解锁文章















897























