什么是Websocket?
Websocket是一个独立于http的实时通信协议,最初是在HTML5中被引用进来的,在HTML5规范中作为浏览器与服务器的核心通信技术被嵌入到浏览器中。WebSocket的出现使得浏览器提供对Socket的支持成为可能,从而在浏览器和服务器之间提供了一个基于TCP连接的双向通道。
在websocket诞生之前,服务端想要向客户端推送数据只能通过客户端向服务端主动发送请求才能获得。在构建实时Web应用时,最常用的就是轮询 (Polling)和Comet技术,而Comet技术实际上是轮询技术的改进,又可细分为两种实现方式,一种是长轮询机制,一种称为流技术。
轮询:这是最早的一种实现实时 Web 应用的方案。客户端以一定的时间间隔向服务端发出请求,以频繁请求的方式来保持客户端和服务器端的同步。
长轮询:长轮询则是针对普通轮询的这种缺陷的一种改进方案,其具体实现方式是如果当前请求没有数据可以返回,则继续保持当前请求的网络连接状态,直到服务端有数据可以返回或者连接超时。长轮询通过这种方式减少了客户端与服务端交互的次数,避免了一些无谓的网络连接。
流:流就是在客户端的页面向服务端发出一个长连接的请求。服务器端接到这个请求后作出回应并不断更新连接状态以保证客户端和服务器端的连接不过期。通过这种机制可以将服务器端的信息源源不断地推向客户端。
综上所述,以上这些方案实质上都是用ajax的方法模拟实时效果,实质上并没有实现真正的实时技术。同时每一次交互都是一次http请求和相应的过程,这就增加了网络的负载。
Websocket是独立的基于TCP的协议,其跟http协议的关系仅仅是WebSocket的握手被http服务器当做Upgrade request http包处理。Websocket有自己的握手处理过程。
Websocket链接由客户端发起握手请求,协议内容如下:
1 GET /chat HTTP/1.1 2 Host: server.example.com 3 Upgrade: websocket 4 Connection: Upgrade 5 Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== 6 Sec-WebSocket-Protocol: chat, superchat 7 Sec-WebSocket-Version: 13 8 Origin: http://example.com
服务端的相应如下:
1 HTTP/1.1 101 Switching Protocols 2 Upgrade: websocket 3 Connection: Upgrade 4 Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk= 5 Sec-WebSocket-Protocol: chat
一旦建立了连接,服务端与客户端之间就可以以全双工方式进行通信。
什么是Socket.io?
有很多人经常讲Socket.io与websocket搞混,实际上他们并不完全等同。它一个完全由JavaScript实现、基于Node.js、支持WebSocket协议用于实时通信、跨平台的开源框架,它包括了客户端的JavaScript和服务器端的Node.js。也就是说Socket.io将Websocket和轮询(Polling)机制以及其它的实时通信方式封装成了通用的接口,并且在服务端实现了这些实时通信机制。
Socket.io中主要使用了websocket,将轮询作为其辅助选项,提供的是相同的接口。其与node.js一样,也是事件驱动的。
参考:
https://github.com/socketio/socket.io
http://blog.csdn.net/ishallwin/article/details/10299815
http://www.ibm.com/developerworks/cn/web/1112_huangxa_websocket/index.html