Movatterモバイル変換


[0]ホーム

URL:


Python利用Socket.IO实现消息实时推送

最新推荐文章于 2025-10-16 13:21:24 发布
原创最新推荐文章于 2025-10-16 13:21:24 发布·1.5w 阅读
· 8
· 38·
CC 4.0 BY-SA版权
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
文章标签:

#python#websocket

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',
最低0.47元/天 解锁文章
确定要放弃本次机会?
福利倒计时
::

立减 ¥

普通VIP年卡可用
立即使用
5 条评论您还未登录,请先登录后发表或查看评论

5 条评论

  • ffscool
    ffscool2021.11.15
    您好,有没有完整项目代码呀,关注用户代码following.py看不太明白
  • fcynzblyyy
    仑灵2021.01.24
    请问socketio.AsyncClient()这个的使用方法跟socketio.client有什么区别吗最近遇到这个异步客户端挺难的
  • weixin_43728225
    Exdous rivière2021.01.16
    博主你好, 请问,这个可以用在UI客户端界面上吗?
  • weixin_44754740
    DLAM-小叮当2020.12.14
    怎样理解@sio.on里面的参数和对应下面函数名的关系[face]monkey:0.gif[/face]
    • qq_44484910
      D__pythoner回复DLAM-小叮当2020.12.15
      函数名可以随便起。sio.on里面的字符串是事件名称,除了connect和disconnect是socketio服务自定的特殊事件,其他的自定义的事件名称可以随便起名字

博客等级

码龄7年
32
原创
22
点赞
83
收藏
10
粉丝
关注
私信

TA的精选

查看更多

大家在看

TA的历史创作历程

分类专栏

展开全部收起

上一篇:
Java学习之路-(异常、多线程)
下一篇:
初探Elasticsearch(强大的开源搜索引擎)

目录

展开全部

收起

目录

展开全部

收起

上一篇:
Java学习之路-(异常、多线程)
下一篇:
初探Elasticsearch(强大的开源搜索引擎)

目录

评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
查看更多评论
 条评论被折叠 查看
被折叠的  条评论为什么被折叠?到【灌水乐园】发言
查看更多评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

[8]ページ先頭

©2009-2025 Movatter.jp