之前从来没有了解过socketio,或者说连polling、websocket此类全双工通信协议的使用概念都没有,但是突然要做一个使用此类技术的项目,于是赶鸭子上架,开学了扫盲和搬码,在搬码之前总得让自己有一些基础的概念,下面是从网络上了解到和收集到的一些知识。
一、综述
http:http是一种面向连接(基于TCP协议)的单向的通信协议,总的来说就是客户端发送一个request请求(GET、POST、PUT……),然后服务器接到请求之后,经过后台的处理,将数据通过response发送回客户端。从这个简单的描述可以看出,服务器是一个被动接收者。更加详细的内容可以参见http协议说明,或者这篇通俗的文章——《HTTP粗解》(人家原名叫详解,说实在的详的太粗……)
但是我们在很多的实际应用中,我们是需要前后端保持一种实时的通信的,又或者说服务器也需要能够主动联系到客户端,或者我们需要实时从服务器获取最新的数据(如股票交易等),总不能让用户不停的刷新浏览器吧,比如我们的即时通信,又比如我们现在的各种直播啊,聊天室啊等等。这样就慢慢延伸出来了新的技术
Comet:它会延迟完成 HTTP 响应以将消息传递到客户端。基于 Comet 的推送一般采用 JavaScript 实现并使用长连接或流等连接策略。 基于 HTTP 长连接的“服务器推”技术。基于这种架构开发的应用中,服务器端会主动以异步的方式向客户端程序推送数据,而不需要客户端显式的发出请求。Comet 架构非常适合事件驱动的 Web 应用,以及对交互性和实时性要求很强的应用,如股票交易行情分析、聊天室和 Web 版在线游戏等。
polling:浏览器定期发送 HTTP 请求并立即接收响应,这项技术是浏览器首次尝试传递实时信息。显然,如果消息传递的确切时间间隔已知,这是一个很好的解决方案,因为可以在服务器上先把需要发送的信息准备好之后在发送给客户端。然而,实时数据通常是不可预测的,这必然造成许多不必要的请求,因此,在低频率消息的情况下,许多连接被不必要地打开和关闭的
Long-Polling (长轮询):长轮询是让服务器在接收到浏览器所送出 HTTP 请求后,服务器会等待一段时间,若在这段时间里面服务器有新的消息,它就会把最新的消息传回给浏览器,如果等待的时间到了之后也没有新的消息的话,就会送一个回应给浏览器,告知浏览器消息没有更新。虽然轮询可以减少产生原本轮询造成网络带宽浪费的情况,但是,如果在资料更新频繁的状况下,长时间轮询不传统比传统的轮询有效率,而且有时候资料量很大时,会造成连续的轮询不断产生,反而会更糟糕。
WebSocket:是一种在单个TCP连接上进行全双工通信的协议。在WebSocket API中,浏览器和服务器只需要完成一次握手(不是指建立TCP连接的那个三次握手,是指在建立TCP连接后传输一次握手数据),两者之间就直接可以创建持久性的连接,并进行双向数据传输。Websocket使用和 HTTP 相同的 TCP 端口,可以绕过大多数防火墙的限制。默认情况下,Websocket协议使用80端口;运行在TLS之上时,默认使用443端口。
Socket.IO :原本一个面向实时 web 应用的 JavaScript 库,现在已成为拥有众多语言支持的Web即时通讯应用的框架。Socket.IO 主要使用WebSocket协议。但是如果需要的话,Socket.io可以回退到几种其它方法,例如Adobe Flash Sockets,JSONP拉取,或是传统的AJAX拉取,并且在同时提供完全相同的接口。尽管它可以被用作WebSocket的包装库,它还是提供了许多其它功能,比如广播至多个套接字,存储与不同客户有关的数据,和异步IO操作。Socket.IO 不等价于 WebSocket,WebSocket只是Socket.IO实现即时通讯的其中一种技术依赖,而且Socket.IO还在实现WebSocket协议时做了一些调整
二、Websocket和Socket.io的优缺点对比
WebSocket | Socket.io |
节省资源开销:服务器到客户端的内容,头部大小只有2至10字节(和数据包长度有关),而HTTP请求每次都要携带完整的头部。 更强的实时性:因为协议是全双工的,所以服务器可以随时主动给客户端下发数据。 保持连接状态:Websocket需要先创建连接,这就使得其成为一种有状态的协议,之后通信时可以省略部分状态信息。而HTTP请求可能需要在每个请求都携带状态信息(如身份认证等)。 更好的二进制支持:Websocket定义了二进制帧,相对HTTP,可以更轻松地处理二进制内容。 可扩展:Websocket定义了扩展,用户可以扩展协议、实现部分自定义的子协议。如部分浏览器支持压缩等。 更好的压缩效果:相对于HTTP压缩,Websocket在适当的扩展支持下,可以沿用之前内容的上下文,在传递类似的数据时,可以显著地提高压缩率。 没有同源限制:客户端可以与任意服务器通信。 可以发送文本,也可以发送二进制数据。 |
优点:Socket.IO 会自动选择合适双向通信协议,仅仅需要程序员对套接字的概念有所了解。 有Python库的实现,可以在Python实现的Web应用中去实现IM后台服务。 缺点:Socket.io并不是一个基本的、独立的、能够回退到其它实时协议的WebSocket库,它实际上是一个依赖于其它实时传输协议的自定义实时传输协议的实现。该协议的协商部分使得支持标准WebSocket的客户端不能直接连接到Socket.io服务器,并且支持Socket.io的客户端也不能与非Socket.io框架的WebSocket或Comet服务器通信。因而,Socket.io要求客户端与服务器端均须使用该框架。 |
文章内容参考下面的帖子