websocket基础

来源:互联网 发布:怎么用vs2013写c语言 编辑:程序博客网 时间:2024/04/28 12:22

赢家昨天来工作室,顺便聊到了即时多人在线游戏的服务器,之后又回忆起去年波波做的即时在线聊天,今天在看书的时候遇到了websocket这种技术.于是乎,入坑.

一些基本概念:

推送技术,又名反向AJAX,指的是一种基于Internet,将由中心或发布者发出消息传输给用户的技术。与之相对的是拉取(参见AJAX),这种情况下请求是由用户或客户端主动发起的。


WebSocket是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
在WebSocket API中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。


Comet是一种用于web的推送技术,能使服务器实时地将更新的信息传送到客户端,而无须客户端发出请求,目前有两种实现方式,长轮询和iframe流。
WebSocket将会替换Comet成为服务器推送的方法


长轮询 是在打开一条连接以后保持,等待服务器推送来数据再关闭的方式。
长轮询:客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。
优点:在无消息的情况下不会频繁的请求,耗费资源小。
缺点:服务器hold连接会消耗资源,返回数据顺序无保证,难于管理维护。
实例:WebQQ、Hi网页版、Facebook IM。


iframe流(长连接)版本一方式是在页面中插入一个隐藏的iframe,利用其src属性在服务器和客户端之间创建一条长链接,服务器向iframe传输数据(通常是HTML,内有负责插入信息的javascript),来实时更新页面。
iframe流方式的优点是浏览器兼容好,Google公司在一些产品中使用了iframe流,如Gmail聊天
iframe流(长连接)版本二
在页面里嵌入一个隐蔵iframe,将这个隐蔵iframe的src属性设为对一个长连接的请求或是采用xhr请求,服务器端就能源源不断地往客户端输入数据。
优点:消息即时到达,不发无用请求;管理起来也相对方便。
缺点:服务器维护一个长连接会增加开销。
实例:Gmail聊天


轮询(Polling)版本一是一种CPU决策如何提供周边设备服务的方式,又称“程控输出入”(Programmed I/O)。轮询法的概念是,由CPU定时发出询问,依序询问每一个周边设备是否需要其服务,有即给予服务,服务结束后再问下一个周边,接着不断周而复始。
轮询法实作容易,但效率偏低。
轮询(Polling)版本一
轮询:客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接。
优点:后端程序编写比较容易。
缺点:请求中有大半是无用,浪费带宽和服务器资源。
实例:适于小型应用。


Flash XMLSocket版本一
这种技术被Cbox等一些聊天应用使用。这种情况下,通过一个Javascript控制的一像素的Flash视频实现XMLSocket,客户端可以创建一条TCP连接实现与中继服务器的单向通信。中继服务器不会从Socket读取任何数据,而仅仅是立刻向客户端发送一个唯一标识符。接下来,客户端通过一个HTTP请求将此标识符发送给Web服务器。这样,Web应用程序就能够通过中继服务器向客户推送消息。中继服务器不需要主动打开TCP连接,这样他可以处理数万连接。在这种模式下,主要瓶颈在于服务器操作系统的TCP协议栈。
Flash Socket版本二:在页面中内嵌入一个使用了Socket类的 Flash 程序JavaScript通过调用此Flash程序提供的Socket接口与服务器端的Socket接口进行通信,JavaScript在收到服务器端传送的信息后控制页面的显示。
优点:实现真正的即时通信,而不是伪即时。
缺点:客户端必须安装Flash插件;非HTTP协议,无法自动穿越防火墙。
实例:网络互动游戏。


websocket的优点:

  1. 客户端只与服务器建立一个TCP连接(全双工,持久),可以使用跟少的连接,并且突破浏览器的限制(因为HTTP规范要求浏览器并发连接数限制为每个主机两个连接,但是握手之手,此时的连接已经不是http连接了)
  2. websocket可以推送数据到客户端
  3. 更轻量的协议头(相对http),减少数据传送量
  4. 连接的端口在80(ws)或者433(wss)上创建,与http使用的端口一致
  5. 它使用http握手,所以该协议可以自然地集成到网络浏览器和http服务器
  6. 心跳消息(称为ping,pong)将被反复发送,保持websocket连接几乎一直处于活跃状态,基本上,一个节点周期性的发送一个小数据包到另一个节点(ping),而另一个节点则使用包含了相同数据的数据包作为响应(pong).这将使两个节点都处于连接状态
  7. 该协议将代表你构建消息(不需要额外代码),这样当消息启动和他内容到达时,服务端和客户端都可以知道.
  8. websocket关闭时将发送一个特殊的关闭消息,其中可以包含原因代码和用于解释连接被关闭的文本.
  9. websocket可以安全的支持跨域连接,避免了ajax和xmlhttprequest上的限制.

websocket握手以及websocket数据传输

http://www.cnblogs.com/oshyn/p/3574497.html
https://segmentfault.com/a/1190000000428502

再推荐:

http://www.html5rocks.com/zh/tutorials/websockets/basics/
开涛
http://jinnianshilongnian.iteye.com/category/283927

0 0