竹磬网-邵珠庆の日记 生命只有一次,你可以用它来做些更多伟大的事情–Make the world a little better and easier


107月/170

Web领域的实时推送技术

发布在 邵珠庆

作者:潘良虎
链接:https://www.zhihu.com/question/20215561/answer/26419995
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

WebSocket简介

谈到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来接收发送消息。
WebSocket实战本文将以多人在线聊天应用作为实例场景,我们先来确定这个聊天应用的基本需求。
需求分析1、兼容不支持WebSocket的低版本浏览器。
2、允许客户端有相同的用户名。
3、进入聊天室后可以看到当前在线的用户和在线人数。
4、用户上线或退出,所有在线的客户端应该实时更新。
5、用户发送消息,所有客户端实时收取。

在实际的开发过程中,为了使用WebSocket接口构建Web应用,我们首先需要构建一个实现了 WebSocket规范的服务端,服务端的实现不受平台和开发语言的限制,只需要遵从WebSocket规范即可,目前已经出现了一些比较成熟的WebSocket服务端实现,比如本文使用的Node.js+Socket.IO。为什么选用这个方案呢?先来简单介绍下他们两。
Node.jsNode.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的成长的速度有目共睹,其发展前景获得了技术社区的充分肯定。
Socket.IOSocket.IO是一个开源的WebSocket库,它通过Node.js实现WebSocket服务端,同时也提供客户端JS库。Socket.IO支持以事件为基础的实时双向通讯,它可以工作在任何平台、浏览器或移动设备。
Socket.IO支持4种协议:WebSocket、htmlfile、xhr-polling、jsonp-polling,它会自动根据浏览器选择适合的通讯方式,从而让开发者可以聚焦到功能的实现而不是平台的兼容性,同时Socket.IO具有不错的稳定性和性能。
编码实现

本文一开始的的插图就是效果演示图:可以点击这里查看在线演示,整个开发过程非常简单,下面简单记录了开发步骤:
安装Node.js根据自己的操作系统,去Node.js官网下载安装即可。如果成功安装。在命令行输入node -v和npm -v应该能看到相应的版本号。


搭建WebSocket服务端

这个环节我们尽可能的考虑真实生产环境,把WebSocket后端服务搭建成一个线上可以用域名访问的服务,如果你是在本地开发环境,可以换成本地ip地址,或者使用一个虚拟域名指向本地ip。
先进入到你的工作目录,比如 /workspace/wwwroot/plhwin/realtime.plhwin.com,新建一个名为package.json的文件,内容如下:


接下来使用npm命令安装express和socket.io


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


命令行运行node index.js,如果一切顺利,你应该会看到返回的listening on *:3000字样,这说明服务已经成功搭建了。此时浏览器中打开 localhost:3000 应该可以看到正常的欢迎页面。
如果你想要让服务运行在线上服务器,并且可以通过域名访问的话,可以使用Nginx做代理,在nginx.conf中添加如下配置,然后将域名(比如:realtime.plhwin.com)解析到服务器IP即可。


完成以上步骤,realtime.plhwin.com:3000的后端服务就正常搭建了。


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


客户端代码实现进入客户端工作目录/workspace/wwwroot/plhwin/demo.plhwin.com/chat,新建一个index.html:

上面的html内容本身没有什么好说的,我们主要看看里面的4个文件请求:
1、realtime.plhwin.com:3000
2、style.css
3、json3.min.js
4、client.js
第1个JS是Socket.IO提供的客户端JS文件,在前面安装服务端的步骤中,当npm安装完socket.io并搭建起WebServer后,这个JS文件就可以正常访问了。

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

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

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


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

上面所有的客户端和服务端的代码可以从Github上获得,地址:github.com/plhwin/nodej

下载本地后有两个文件夹 client 和 server,client文件夹是客户端源码,可以放在Nginx/Apache的WebServer中,也可以放在Node.js的WebServer中。后面的server文件夹里的代码是websocket服务端代码,放在Node.js环境中,使用npm安装完 express 和 socket.io 后,node index.js 启动后端服务就可以了。
留给我们的思考

1、假设是一个在线客服系统,里面有许多的公司使用你的服务,每个公司自己的用户可以通过一个专属URL地址进入该公司的聊天室,聊天是一对一的,每个公司可以新建多个客服人员,每个客服人员可以同时和客户端的多个用户聊天。
2、又假设是一个在线WebIM系统,实现类似微信,qq的功能,客户端可以看到好友在线状态,在线列表,添加好友,删除好友,新建群组等,消息的发送除了支持基本的文字外,还能支持表情、图片和文件。
有兴趣的同学可以继续深入研究。
--------------------------
上面是我前段时间写的一篇与WebSocket这个主题相关的文档,就直接贴过来了,原文请见:使用Node.js+Socket.IO搭建WebSocket实时应用

411月/091

2010年中国互联网最火爆六大领域

发布在 邵珠庆

2009年,中国网民规模达到了3.84亿人,普及率达到28.9%。而四川网民达到了1635万,增速居全国第五。据艾瑞咨询统计,2009年中国互联网经济规模达743亿元,预测2010年互联网经济年营收规模将超1000亿元。
2010年,中国互联网领域会有哪些新兴的商业模式概念突进,成为这个产业里的火爆者?昨天,记者采访了国内著名IT评论人、互联网实验室原总裁刘兴亮。在他看来,微博客、云计算、网络游戏、电子商务、企业级互联网解决方案、HULU式视频网站,可能是2010年中国互联网最火爆的六大领域。
领域1:微博客 将成为各大网站的必备
记者:微博客实际上去年就看出红火的苗头,今年是不是会扩展到更多网站来应用?
刘兴亮:微博客可以算是新兴起的一类开放互联网社交服务,国际上最知名的微博网站是Twitter,目前已是最炙手可热的互联网新贵,美国总统奥巴马、美国白宫、FBI、Google、HTC、DELL、福布斯、通用汽车等都在Twitter上进行营销和与用户交互。而在国内,目前著名的微博有:新浪微博、搜狐微博、网易微博、嘀咕、叽歪、滴、做啥、139说客、9911等。
年终岁末,微博这种新式互联网应用在中国异常火爆。毫无疑问,微博将是互联网行业未来两三年引导创新的热点,也将是潮流引爆点。可以预测的是,就像BBS、博客一样,2010年微博客也将成为各大网站不可或缺的一部分。到了2010年年底,如果没有配备微博客,都不好意思说自己是中大型网站。
领域2:云计算 今年可获得两倍增长
记者:对云计算的增长前景,你给一个通俗的说法吧?
刘兴亮:狭义云计算是指IT基础设施的交付和使用模式,指通过网络以按需、易扩展的方式获得所需的资源;广义云计算是指服务的交付和使用模式,指通过网络以按需、易扩展的方式获得所需的服务。这种服务可以是IT和软件、互联网相关的,也可以是任意其他的服务。通俗点说,云计算就好像电表和电线路,用户不需要自己再发电了,只需要接上电,安上电表,按需付费即可;也可以比喻为煤气管道,用户再也不需要自己去买一罐一罐的煤气了。
现在我们开一个公司,首先要考虑是买很多电脑,配备几台服务器。再过几年,回过头来看看今天开公司的做法,可能就会感觉很傻。就好像早些年,开公司开工厂必须先买发电机一样。但现在,谁还买发电机?云计算就是这么个玩意。提供云计算服务的公司,在2010年至少可以获得两倍的增长。

领域3:手机游戏将逐渐向网游全面过渡
记者:网络游戏已经是一个老生常谈
的领域,今年会有什么新的变化?
刘兴亮:即使最不乐观地估计,2010年网络游戏也将增长30%左右。其中,手机游戏力量进一步崛起,应用商店模式将改变手机游戏研发企业(CP)对SP渠道的严重依赖,手机游戏研发企业将成为电信运营商、通讯设备制造商、移动应用增值服务商(SP)及各种投资机构争相拉拢的对象。同时,手机游戏业将与当年PC游戏一样进一步向网游全面过渡。
领域4:电子商务 B2C将取代C2C成为主流
记者:电子商务今年的突破点在哪里?刘兴亮:电子商务经历了过去近十年的高速发展之后,正在逐步进入一个新的发展时期。这些年,中国电子商务的主流是C2C,这有点不正常。进入2010年之后,B2C模式将逐渐成为主流。除了京东、VANCL这些平台外,2010年更多的传统企业会纷纷“触网”,加入B2C行列。电子商务将引领整个互联网产业的发展。目前互联网行业迎来了第三股浪潮,将把互联网植入传统产业。当两者无缝对接后,会产生全新的商业模式,对企业的组织结构、经营模式都将带来巨大冲击。
领域5:企业级解决方案 舆情监测将越来越受企业重视
记者:你看好的企业级互联网解决方案,是不是指第三方提供的建站类服务?
刘兴亮:不光是这样。你可以看到,当越来越多的传统企业加入互联网大潮后,就迫切需要有专门的公司为他们量身定做一整套的互联网解决方案,可能会包括网站建设、SEO、舆情监测、电子商务等等。同时,互联网行业将越来越细分化,比如舆情监测等,即使互联网公司也需要,也越来越重视。
领域6:视频网站 以版权内容为主的网站大行其道
记者:视频网站去年以版权纠纷最为抢眼,是不是会由此导致今年市场格局的变化呢?
刘兴亮:目前看来,视频网站主要有两个派别,一个是以版权内容为主的主流资讯网站,代表选手是由NBC和新闻集团共同注册成立的Hulu;另一个派别就是以YouTube为代表的视频分享网站,强调原创性和自由分享。
前几年的中国网络视频市场上,视频分享网站发展得异常迅猛。但到了去年末,发展势头悄然出现了变化。随着网络视频国家队的进入,百度、网易等准备开始做以版权内容为主的视频网站,再加上搜狐、酷6等大规模删除了非版权内容,视频分享网站已经不再主流,开始走向衰落。
从受广告主青睐的程度来看,视频分享网站没法和主流视频资讯网站相比。美国市场就是一个典型的例子,后起步的Hulu已经盈利,先发展的YouTube却还在苦苦挣扎。我预测,2010年,HULU式视频网站将大行其道。(罗曙驰)