学习目标
1.能够说明实现在线即时通讯的方法
1.轮询 2.长轮询 3.websocket 4.http/2.0
2.能够说明websocket与http和tcp的关系
1.websocket和http是应用层协议
2.tcp是传输层协议
3.websocket和http是基于tcp.
4.websocket握手数据用到http协议报文
3.能够知道socketio与websocket的关系
1.socketio是一个即时通讯框架
2.socketio封装websocket协议,但是如果客户端或者服务器不支持,就会退化到轮询。
4.能够知道socketio服务器选择协程实现的原因
1.效率更好,性能更好。
2.可以有更高的并发能力。
5.能够使用eventlet创建socketio服务器
6.能够在socketio服务器中编写事件消息处理函数
@sio.on('connect')
@sio.on('disconnect')
@sio.on('message')
sio.emit('message', msg, room=sid)
sio.send(msg, room=sid)
7.能够在socketio中使用emit发送事件消息
sio.emit('message', msg, room=房间名称)
sio.send()
8.能够说明用户关注消息推送的业务流程
9.能够使用rabbitmq作为消息队列实现用户关注业务的消息推送
1.web
app.mgr = socketio.Kombumanager(rabbitmq-url)
current_app.mgr.emit()
# 此时发送的数据,放在rabbitmq中
2.IM
mgr = socketio.Kombumanater(rabbitmq-url)
sio = socketio.Server(async_mode='eventlet', client_manager=mgr)
10.能够使用firecamp工具调试socketio服务
1.即时通信简介
-
目标:了解什么是即时通讯
-
概念:
即时通信(Instant Messaging,简称IM)是一种透过网络进行实时通信的系统,允许两人或多人使用网络即时的传递文字消息、文件、语音与视频交流。通常以网站、计算机软件或移动应用程序的方式提供服务。
-
即时通讯软件:
qq、微信、钉钉、内网通等,这些都是即时通讯软件。
2.即时通讯技术
-
目标:知道实现及时通讯的几种技术手段
-
1.基于http 1.x 协议,使用轮询的方式。
普通轮询. 优点: 通用、简单,不用使用其他额外的技术。 缺点: 占带宽,占服务器资源(不断建立、断开连接,对服务器都是一种资源开销) 长轮询 优点: 长轮询和短轮询比起来,明显减少了很多不必要的http请求次数,相比之下节约了资源。 缺点: 长轮询的缺点在于,连接挂起也会导致资源的浪费。
-
2.基于WebSocket协议,实现实时推送。
-
3.http/2.0,未来的技术。
-
备注:
1.无论是普通轮询还是长连接轮询,都是属于被动的方式。 2.WebSocket和http/2.0是属于主动推送的方式。
3.WebSocket简介
-
目标:对WebSocket协议有一个基本的认识
-
诞生
WebSocket 协议在2008年诞生,2011年成为国际标准。所有浏览器都已经支持了。
-
特点
1.服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。 2.建立在 TCP 协议之上,服务器端的实现比较容易。 3.与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。 4.数据格式比较轻量,性能开销小,通信高效。 5.可以发送文本,也可以发送二进制数据。 6.没有同源限制,客户端可以与任意服务器通信。 7.协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。
4.WebSocket与tcp和http的关系
-
目标:对他们三个协议之间的关系,有一个基本的了解。
1.WebSocket和http都是属于应用层协议,tcp是传输层协议。 2.WebSocket和http都是基于tcp协议的应用层协议。 3.WebSocket协议使用http报文握手,建立WebSocket连接通讯。
5.Socket.IO简介
-
目标:对Socket.IO框架有基本的认识
-
基本介绍
Socket.IO拥有众多语言支持的Web即时通讯应用的框架。
-
需要注意的几个问题:
1.Socket.IO 不等价于 WebSocket, 并不是简单的对WebSocke进行了封装。 2.如果选择了Socket.IO框架,前后端都要使用。不能单方使用。 3.Socket.IO框架是基于事件处理的。
6.socketio服务器的选择
-
目标:知道运行socketio服务器的几种方式。
-
方式1:
使用多进程多线程模式的WSGI服务器对接 缺点: 一个进程或者一个线程维护一个客户端连接,太耗服务器资源。效率低,并发低。
-
方式2:
作为Flask、Django 应用中的一部分 缺点: 跟方式1一样会遇到同样的问题
-
方式3:
使用协程的方式运行 (推荐) 优点: 可以提升即时通信服务器的性能。
-
备注:
1.协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。 2.协程执行效率高。因为子程序切换不是线程切换,而是由程序自身控制,没有线程切换的开销,所以和多线程比,协程的执行效率更高。而且,并发越高,协程的性能优势就越明显。
7.socketio的基本使用
-
安装:
pip install python-socketio
-
使用协程的方式。
-
文件: d01_IM_server.py
-
步骤
-
1.使用monkey_patch方法改写原来io操作的接口,变成以协程的方式调用
import eventlet # 1.使用monkey_patch方法改写系统io接口,以便以协程的方式调用 eventlet.monkey_patch() import socketio import eventlet.wsgi
-
2.使用eventlet(协程)的方式,创建socketio对象
sio = socketio.Server(async_mode='eventlet')
-
3.使用sio创建符合WSGI协议的app对象
app = socketio.Middleware(sio)
-
4.监听消息事件