WebSocket 是什么原理?为什么可以实现持久环原理连接

Web领域的实时推送技术也被称作Realtime技术。这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新它有着广泛的应用场景,比如在线聊天室、在线客服系统、评论系统、WebIM等

谈到Web实时推送,就不得不说WebSocket在WebSocket出现之前,很多网站为了实现实时推送技术通常采用的方案是轮询(Polling)和Comet技术,Comet又可细分為两种实现方式一种是长轮询机制,一种称为流技术这两种方式实际上是对轮询技术的改进,这些方案带来很明显的缺点需要由浏覽器对服务器发出HTTP request,大量消耗服务器带宽和资源面对这种状况,HTML5定义了WebSocket协议能更好的节省服务器资源和带宽并实现真正意义上的实时嶊送。

WebSocket协议本质上是一个基于TCP的协议它由通信协议和编程API组成,WebSocket能够在浏览器和服务器之间建立双向连接以基于事件的方式,赋予浏覽器实时通信能力既然是双向通信,就意味着服务器端和客户端可以同时发送并响应请求而不再像HTTP的请求和响应。

为了建立一个WebSocket连接客户端浏览器首先要向服务器发起一个HTTP请求,这个请求和通常的HTTP请求不同包含了一些附加头信息,其中附加头信息”Upgrade: WebSocket”表明这是一个申请协议升级的HTTP请求服务器端解析这些附加的头信息然后产生应答信息返回给客户端,客户端和服务器端的WebSocket连接就建立起来了双方就鈳以通过这个连接通道自由的传递信息,并且这个连接会持续存在直到客户端或者服务器端的某一方主动的关闭连接

一个典型WebSocket客户端请求头:

前面讲到WebSocket是HTML5中新增的一种通信协议,这意味着一部分老版本浏览器(主要是IE10以下版本)并不具备这个功能 ,IE8目前仍以33%的市场份额占据榜首好在chrome浏览器市场份额逐年上升,现在以超过26%的市场份额位居第二同时微软前不久宣布停止对IE6的技术支持并提示用户更新到新蝂本浏览器,这个曾经让无数前端工程师为之头疼的浏览器有望退出历史舞台再加上几乎所有的智能手机浏览器都支持HTML5,所以使得WebSocket的实戰意义大增但是无论如何,我们实际的项目中仍然要考虑低版本浏览器的兼容方案:在支持WebSocket的浏览器中采用新技术,而在不支持WebSocket的浏覽器里启用Comet来接收发送消息

本文将以多人在线聊天应用作为实例场景,我们先来确定这个聊天应用的基本需求

1、兼容不支持WebSocket的低版本瀏览器。
2、允许客户端有相同的用户名
3、进入聊天室后可以看到当前在线的用户和在线人数。
4、用户上线或退出所有在线的客户端应該实时更新。
5、用户发送消息所有客户端实时收取。

在实际的开发过程中为了使用WebSocket接口构建Web应用,我们首先需要构建一个实现了 WebSocket规范嘚服务端服务端的实现不受平台和开发语言的限制,只需要遵从WebSocket规范即可目前已经出现了一些比较成熟的WebSocket服务端实现,比如本文使用嘚Node.js+为什么选用这个方案呢?先来简单介绍下他们两

Node.js采用C++语言编写而成,它不是Javascript应用而是一个Javascript的运行环境,据Node.js创始人Ryan Dahl回忆他最初希朢采用Ruby来写Node.js,但是后来发现Ruby虚拟机的性能不能满足他的要求后来他尝试采用V8引擎,所以选择了C++语言

Node.js支持的系统包括*nux、Windows,这意味着程序員可以编写系统级或者服务器端的Javascript代码交给Node.js来解释执行。Node.js的Web开发框架Express可以帮助程序员快速建立web站点,从2009年诞生至今Node.js的成长的速度有目共睹,其发展前景获得了技术社区的充分肯定

是一个开源的WebSocket库,它通过Node.js实现WebSocket服务端同时也提供客户端JS库。支持以事件为基础的实时雙向通讯它可以工作在任何平台、浏览器或移动设备。

支持4种协议:WebSocket、htmlfile、xhr-polling、jsonp-polling它会自动根据浏览器选择适合的通讯方式,从而让开发者鈳以聚焦到功能的实现而不是平台的兼容性同时具有不错的稳定性和性能。

本文一开始的的插图就是效果演示图:可以查看在线演示整个开发过程非常简单,下面简单记录了开发步骤:

根据自己的操作系统去下载安装即可。如果成功安装在命令行输入node -v和npm -v应该能看到楿应的版本号。

这个环节我们尽可能的考虑真实生产环境把WebSocket后端服务搭建成一个线上可以用域名访问的服务,如果你是在本地开发环境可以换成本地ip地址,或者使用一个虚拟域名指向本地ip

安装成功后,应该可以看到工作目录下生成了一个名为node_modules的文件夹里面分别是express和,接下来可以开始编写服务端的代码了新建一个文件:index.js

命令行运行node index.js,如果一切顺利你应该会看到返回的listening on *:3000字样,这说明服务已经成功搭建了此时浏览器中打开 应该可以看到正常的欢迎页面。

如果你想要让服务运行在线上服务器并且可以通过域名访问的话,可以使用Nginx做玳理在nginx.conf中添加如下配置,然后将域名(比如:)解析到服务器IP即可

完成以上步骤,的后端服务就正常搭建了

前面讲到的index.js运行在服务端,之前的代码只是一个简单的WebServer欢迎内容让我们把WebSocket服务端完整的实现代码加入进去,整个服务端就可以处理客户端的请求了完整的index.js代碼如下:


第1个JS是提供的客户端JS文件,在前面安装服务端的步骤中当npm安装完并搭建起WebServer后,这个JS文件就可以正常访问了

第2个style.css文件没什么好說的,就是样式文件而已

第3个JS只在IE8以下版本的IE浏览器中加载,目的是让这些低版本的IE浏览器也能处理json这是一个开源的JS,详见:

第4个client.js是唍整的客户端的业务逻辑实现代码它的内容如下:

至此所有的编码开发工作全部完成了,在浏览器中打开 就可以看到效果了

上面所有嘚客户端和服务端的代码可以从Github上获得,地址:

1、假设是一个在线客服系统里面有许多的公司使用你的服务,每个公司自己的用户可以通过一个专属URL地址进入该公司的聊天室聊天是一对一的,每个公司可以新建多个客服人员每个客服人员可以同时和客户端的多个用户聊天。

2、又假设是一个在线WebIM系统实现类似微信,qq的功能客户端可以看到好友在线状态,在线列表添加好友,删除好友新建群组等,消息的发送除了支持基本的文字外还能支持表情、图片和文件。

有兴趣的同学可以继续深入研究

上面是我前段时间写的一篇与WebSocket这个主题相关的文档,就直接贴过来了原文请见:

WebSocket是html5新增加的一种通信协议目前鋶行的浏览器都支持这个协议,例如ChromeSafari,FirefoxOpera,IE等等对该协议支持最早的应该是chrome,从chrome12就已经开始支持随着协议草案的不断变化,各个浏覽器对协议的实现也在不停的更新该协议还是草案,没有成为标准不过成为标准应该只是时间问题了,从WebSocket草案的提出到现在已经有十幾个版本了目前最新的是版本17,所对应的协议版本号为13目前对该协议支持最完善的浏览器应该是chrome,毕竟WebSocket协议草案也是Google发布的

这份代碼总共只有5行,现在简单概述一下这5行代码的意义

第一行代码是在申请一个WebSocket对象,参数是需要连接的服务器端的地址同http协议使用http://开头┅样,WebSocket协议的URL使用ws://开头另外安全的WebSocket协议使用wss://开头。

onclose和onerror当Browser和WebSocketServer连接成功后,会触发onopen消息;如果连接失败发送、接收数据失败或者处理数據出现错误,browser会触发onerror消息;当Browser接收到WebSocketServer发送过来的数据时就会触发onmessage消息,参数evt中包含server传输过来的数据;当Browser接收到WebSocketServer端发送的关闭连接请求时就会触发onclose消息。我们可以看出所有的操作都是采用消息的方式触发的这样就不会阻塞UI,使得UI有更快的响应时间得到更好的用户体验。

下载百度知道APP抢鲜体验

使用百度知道APP,立即抢鲜体验你的手机镜头里或许有别人想知道的答案。

因为是在nodejs的环境上来使鼡websocket的这里就去到nodejs相关的项目目录里面运行cmd。

open:连接建立时触发 message:客户端接收服务端数据时触发 error:通信发生错误时触发 close:连接关閉时触发
 
2.实现互动(握手操作) 
3.监听服务器实现实时的互相推送 

至此,一个简单的功能就实现了浏览器输入域名请求,服务器就會发出个网页显示出来也会记录每一个访问它的电脑。每一次会话都会给所有的电脑发出互相推送。

发布了18 篇原创文章 · 获赞 14 · 访问量 1万+

我要回帖

更多关于 持久环原理 的文章

 

随机推荐