即时通讯

时间:2020-10-20

语音聊天

websocket连接过程

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

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

传统的推送实现
注意:HTTP/1.x 不支持服务器主动推送,只能在客户端发起请求后做出回应。 (HTTP/2支持服务器主动推送,但HTTP/2 还未全面实施)

轮询

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

缺点:

效率低下,浪费资源

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

Comet (基于长连接)

缺点:

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

jicfo


Websocket使用ws或wss的统一资源标志符,类似于HTTPS,其中wss表示在TLS之上的Websocket。
ws和HTTP一样,用80端口。wss和HTTPS一样,用443端口。wss表示在TLS之上的Websocket。


握手协议
WebSocket 是独立的、创建在 TCP 上的协议。
Websocket 通过 HTTP/1.1 协议的101状态码进行握手。
为了创建Websocket连接,需要通过浏览器发出请求,之后服务器进行回应,这个过程通常称为“握手”(handshaking)。
websocket优点:


较少的控制开销。相对于HTTP每次请求都携带完整头部,此项开销显著减少了。
2.更强的实时性。全双工协议,故服务器可以随时主动给客户端下发数据。
3.保持连接状态。Websocket定义了二进制帧,相对HTTP,可以更轻松地处理二进制内容。
4.可以支持扩展。
5.更好的压缩效果。相对于HTTP压缩,Websocket在适当的扩展支持下,可以沿用之前内容的上下文,在传递类似的数据时,可以显著地提高压缩率。
6.没有同源限制,客户端可以与任意服务器通信。
7.可以发送文本,也可以发送二进制数据。
Socket.IO
同时支持websocket协议和HTTP1.x协议的框架。使用原因就是虽然websocket是主流浏览器都在用,但并不是所有,所以对于未使用websocket协议的浏览器需要使用轮询。socket.io就是封装了这两个协议的框架,自动切换协议。
Socket.IO 本是一个面向实时 web 应用的 JavaScript 库,现在已成为拥有众多语言支持的Web即时通讯应用的框架。
Socket.IO 主要使用WebSocket协议。但并不是只能使用WebSocket协议,也可以使用其他诸如Adobe Flash Sockets,JSONP拉取,或是传统的AJAX拉取方法。
Socket.IO 不等价于 WebSocket,WebSocket只是Socket.IO实现即时通讯的其中一种技术依赖,而且Socket.IO还在实现WebSocket协议时做了一些调整。
Socket.IO优点:

Socket.IO缺点:

1.方式一:
使用多进程多线程模式的WSGI服务器对接(如uWSGI、gunicorn)

创建好app对象后,使用uWSGI、或gunicorn服务器运行此对象。
2.方式二:
作为Flask、Django 应用中的一部分

创建好app对象后,使用uWSGI、或gunicorn服务器运行此对象。
3.方式三:
使用协程的方式运行 (推荐)

注意:因为服务器与客户端进行即时通信时,会尽可能的使用长连接,所以若服务器采用多进程或多线程方式运行,受限于服务器能创建的进程或线程数,能够支持的并发连接客户端不会很高,也就是服务器性能有限。采用协程方式运行服务器,可以提升即时通信服务器的性能。

不同于HTTP服务的编写方式,SocketIO服务编写不再以请求Request和响应Response来处理,而是对收发的数据以消息(message)来对待,收发的不同类别的消息数据又以事件(event)来区分。

原本HTTP服务编写中处理请求、构造响应的视图处理函数在SocketIO服务中改为编写收发不同事件的事件处理函数。
1.事件处理方法
编写事件处理方法,可以接收指定的事件消息数据,并在处理方法中对消息数据进行处理。

注意:

connect 为特殊事件,当客户端连接后自动执行

disconnect 为特殊事件,当客户端断开连接后自动执行

connect、disconnect与自定义事件处理方法的函数传入参数不同

2.发送事件消息
2.1 群发

2.2 给指定用户发送

2.3 给一组用户发送
SocketIO提供了房间(room)来为客户端分组。

将连接的客户端添加到一个room

注意:当客户端连接后,socketio会自动将客户端添加到以此客户端sid为名的room中

将客户端从一个room中移除

查询sid客户端所在的所有房间

给一组用户发送消息的示例

也可在群组发消息时跳过指定客户端

使用send发送message事件消息
对于'message'事件,可以使用send方法

使用firecamp.app进行测试