在线推送
适用于APP 网页
自己使用即时通讯技术来搭建
引入第三方服务
自己写socket
离线推送
适用于APP
IOS使用苹果的服务 APNS
andrios 使用googleFCM服务 国内服务器
方案
- HTTP/1.x 协议
- 轮询
- comet
- **Websocket **协议
- HTML5定义了Websocket协议
- 是真正的长连接,来完成双方互传数据
- Websocket是一种再单个TCP连接上进行全双工通信的协议,通信双方随时都可以向对方发送数据
- Websocket的建立离不开进行第一次HTTP的请响应
- HTTP/2 协议标准 离具体推广还有时间
- 问题:
- 如何兼容老浏览器和新浏览器
- 老 -> 轮询
- 新 -> websocket
- Socket.io 框架工具 能够解决适配问题
Scoket.Io
Socket.IO 本是一个面向实时 web 应用的 JavaScript 库,现在已成为拥有众多语言支持的Web即时通讯应用的框架
这个框架中同时提供了轮询和websocket的通讯开发支持, 只要编写一套前后端代码,可以适配任何浏览器
Scoket.Io不等价于WebScoket, socketio再封装websocket协议实现的时候,对websocket协议做了调整,所以不再兼容原生的websocket,意味着前端与后端必须采用sicketio来实现才能完成即时通讯
优点: 一次编写 适配任何情况
缺点: 强制要求前后都安必须是socketio
编写开发
- 创建socketio服务器
- 每一个进行即时通讯的客户端,对应的服务器都是一个独立的tcp连接, 长连接
- 与web业务服务器融合(将socketio提供的即时通讯功能融合到flask或者django中)
- 单独编写socketio服务器,独立于任何web框架程序
- 多线程或多进程
- 协程方式运行
- 编写收发数据的处理方法
- 消息数据
- 对客户端与服务器互相发送的消息数据进行分类,叫做时间消息,每一个类别的消息都是一个事件
- 接受事件消息数据
- connect与客户端建立websocket连接 收到的事件消息
- disconnect与客户端断开连接 收到的事件消息
- 自定义的事件消息
- 发送事件消息数据 sio.emit(事件类型, 消息数据内容, 接收人)
from server import sio
import time
@sio.on('connect')
def on_connect(sid, environ):
"""
与客户端建立好连接后被执行
:param sid: string sid是socketio为当前连接客户端生成的识别id
:param environ: dict 在连接握手时客户端发送的握手数据(HTTP报文解析之后的字典)
"""
# sio.emit(消息事件类型, 消息数据内容, 接收人)
# 与前端约定好, 聊天的内容 数据格式
data = {
'msg': 'hello',
'timestamp': round(time.time() * 1000)
}
# 与前端约定好,聊天的内容数据都定义为message类型
sio.emit('message', data, room=sid)
# sio.send(data, room=sid)
@sio.on("message")
def on_message(sid, data):
"""
与前端约定好,前端发送的聊天数据事件类型也是message类型
与前端约定好 前端发送的数据格式也是
{
"msg": xx,
"timestamp": xxx
}
:return:
"""
# 此处使用rpc调用聊天机器人子系统 获取聊天回复内容
resp_data = {
"msg": 'I have received your msg: {}'.format(data.get('msg')),
"timestamp": round(time.time() * 1000)
}
# sio.emit('message', resp_data, room=sid)
sio.send(resp_data, room=sid)