及时通讯

在线推送

适用于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)




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值