flask-web—— 即时通讯 IM、WebSocket、Socket.IO 实时推送消息

一、即时通讯简介

即时通讯(Instant Messaging)是一种基于互联网的即时交流消息的业务。

类型:

  • 在线push

    • 适用:web页面 和 App
    • 自己构建IM服务器
      • 使用WebSocket
      • 采用成熟的框架方案Socket.IO
      • 对于App还可自己封装socket
    • 使用第三方IM服务商提供的服务
  • 离线push

    • 适用:App
    • 对于iOS,使用APNs
    • 对于andorid,使用FCM(国外)或第三方IM服务商提供的服务

提供第三方IM服务的服务商有:

网易云信
融云
环信
LeanCloud

下面只针对 「在线推送」 的自建方案来展开讲解。

二、需求场景

服务端需要主动推送消息给客户端,例如

  • 用户下了订单,需要在运营管理后台向运营人员推送新订单通知
  • 用户A关注了用户B,系统需要向用户B推送提示消息
  • 即时聊天
传统的推送实现

HTTP/1.x 不支持服务器主动推送,只能在客户端发起请求后做出回应。

因为HTTP/1.0 需要自己手动定制 keepalive的请求头,表示保持连接,在收到响应之后不会断开 。而 HTTP/1.1 默认开启了keepalive,使用长连接。 但是keepalived只是声明,表明想要使用长连接,但是通讯双方都有权随时关闭连接

keepalive是保证双方发起多个请求和响应的时候,使用同一个连接

HTTP/2支持服务器主动推送,但HTTP/2 还未全面实施)

轮询

轮询是在特定的的时间间隔(如每1秒),由客户端对服务器发出HTTP请求,了解服务器有没有新的信息,然后由服务器告知有无新数据或返回最新的数据给客户端。

缺点:

效率低下,浪费资源

必须不停连接,或者连接始终打开,但传输HTTP请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。

Comet (基于长连接)

长轮询 长轮询是在打开一条连接以后保持,等待服务器推送来数据再关闭的方式。
iframe流 iframe流方式是在页面中插入一个隐藏的iframe,利用其src属性在服务器和客户端之间创建一条长链接,服务器向iframe传输数据(通常是HTML,内有负责插入信息的javascript),来实时更新页面。

缺点:

依然需要反复发出请求,而且长连接也会消耗服务器资源。

请添加图片描述

三、WebSocket

HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。

在2008年诞生,2011年成为国际标准。

现在基本所有浏览器都已经支持了。

WebSocket是一种在单个TCP连接上进行全双工通信的协议。在WebSocket API中,浏览器和服务器只需要完成一次握手(不是指建立TCP连接的那个三次握手,是指在建立TCP连接后传输一次握手数据),两者之间就直接可以创建持久性的连接,并进行双向数据传输

在这里插入图片描述

Websocket使用ws或wss的统一资源标志符,类似于HTTPS,其中wss表示在TLS之上的Websocket。如:

ws://example.com/wsapi
wss://secure.example.com/

Websocket使用和 HTTP 相同的 TCP 端口,可以绕过大多数防火墙的限制。默认情况下,Websocket协议使用80端口;运行在TLS之上时,默认使用443端口
在这里插入图片描述
握手协议
WebSocket 是独立的、创建在 TCP 上的协议。 报文

Websocket 通过 HTTP/1.1 协议的101状态码进行握手。

为了创建Websocket连接,需要通过浏览器发出请求,之后服务器进行回应,这个过程通常称为“握手”(handshaking)。

一个典型的Websocket握手请求如下:

客户端请求
第一次握手:

GET / HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: example.com
Origin: http://example.com
Sec-WebSocket-Key: sN9cRrP/n9NdMgdcy2VJFQ==
Sec-WebSocket-Version: 13

服务器回应

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: fFBooB7FAkLlXgRSz0BT3v4hq5s=
Sec-WebSocket-Location: ws://exam
  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值