crafty 如何选择css子元素选择器

腾讯科技讯(童云)北京时间5月28日消息,国外媒体今日刊载文章称,一场围绕着移动互联网浏览器市场主导权而展开的“战争”正在升级, () 、、和都卷入了这场战争。文章同时指出,为掌控这一市场而打响的战斗还引发了有关的问题,这家公司现正探索一项移动战略,可能将收购挪威浏览器开发商Opera Software。
以下是这篇文章的全文:
浏览器“战争”正在再次升温,但这一次的战斗是围绕着移动互联网浏览器市场的主导权而展开的。
谷歌、苹果、微软和雅虎都卷入了这场“战争”,挪威人开发的Opera浏览器和Mozilla的开源火狐浏览器也同样涉足其中。
这场战争背后的动机不仅仅是为了争夺夸口的资格。掌控着移动互联网的公司就能将用户导向其网站,而另一点很重要的是,拥有掌控权的公司能搜集用于定位广告的数据。
市场研究公司Opus Research分析师格雷格·斯特林(Greg Sterling)称:“浏览器需要出现在移动设备上才能生存下去,所有人都正尝试在这个多屏幕和多平台的世界中管理自身的策略。”
据另一家市场研究公司StatCounter发布的数据显示,在1月份的全球互联网使用量中,通过移动设备(不包括平板电脑在内)的使用量增长了一倍,所占比例达到了8.5%。
谷歌在今年早些时候加大了在这一领域中的努力,发布了用于移动设备的全版本Chrome浏览器;随着时间的推移,这种浏览器将会取代以谷歌Android操作系统为支持的未命名的移动设备浏览器。StatCounter数据显示,以Android为支持的移动设备浏览器在今年4月份所占市场份额已经达到21.5%,超越了早期的市场领导者Opera,后者所占份额为21.3%。
斯特林指出:“由于Android的缘故,Chrome明显是正处于上升期的‘新人’,在PC市场上拥有很大的动量。”
排在第三位的是苹果的Sarari浏览器,这是iPhone的默认浏览器,所占份额为20%。、黑莓及其他一些厂商的浏览器则占据着较小的份额。
如果把平板电脑也计入在内,那么据美国互联网流量监测机构Net Applications发布的NetMarketShare调查显示,苹果在移动互联网浏览器市场上占据着主导地位,所占份额高达63%;但Android所占份额也在增长中,为接近19%。
谷歌推动移动浏览器增长之举与其战略相符合,即在各个平台上收集有关用户的信息。这样一来,在移动设备上进行搜索的用户可能会在PC上看到感兴趣的定位广告,反之亦然。
谷歌还刚刚完成了125亿美元收购的交易,这令谷歌有能力生产自己的智能手机,从而发挥其自身软件的实力。市场研究公司IDC的分析师艾尔·席尔瓦(Al Hilwa)称:“所有人都想取得与用户联系的第一个点,从而基于这个点来控制用户体验、捕获特定数据和引导其使用自己的服务。所有一切都与掌控有关,与谁能进一步获取数据有关。”
与此同时,微软也正努力试图在移动浏览器市场上获取份额,这家公司正在推动其自己的IE浏览器用于运行Windows操作系统的移动设备;但批评人士指出,这家软件巨头正在限制兼容性。
Mozilla法律总顾问哈维·安德森(Harvey Anderson)在一篇博客文章中抱怨称,微软正在限制外部软件的“先进”性能,从而在实际上隔断了火狐等浏览器的上升道路。他指出,在其最新的Windows 8设备中,微软正在带来“一种不受欢迎的退回到数字‘黑暗时代’的趋势;在那个时代中,用户和开发者在浏览器方面都没得选择”。
雅虎则已成为在移动浏览器方面采取最新举措的公司,推出了专为移动设备设计的Axis浏览器。雅虎产品管理负责人伊桑·巴特拉斯基(Ethan Batraski)在谈及这种浏览器时说道:“其设计目的就是要取代Safari。你将永远都不必再被迫使用Safari。”
专门追踪谷歌的麦格理资本(Macquarie Capital)分析师本·沙赫特(Ben Schachter)称,这家互联网搜索巨头也将推出用于苹果iOS操作系统的Chrome浏览器版本。他在一份客户报告中指出,谷歌得益于Chrome,原因是这使其来自于“流量获取成本”的费用有所减少。他进一步指出,iOS版Chrome浏览器将可“大幅”压低谷歌向苹果支付的费用。
但斯特林指出,苹果可以扭曲自身的战略,不与谷歌展开正面的竞争。他指出,苹果的个人语音助理服务Siri及其最新的地图软件能提供一种搜索类型。在苹果与谷歌之间的紧张关系升级的形势下,苹果可能会将Safari的搜索引擎改为微软必应(Bing),或是换成其他的搜索引擎。
分析师指出,目前还不清楚移动设备制造商将在何种程度上尝试屏蔽作为竞争对手的浏览器,以及这种行为将在多大程度上触发政府的回应措施。在二十世纪九十年代,微软曾试图阻挠竞争对手的浏览器,此举在大西洋两岸都引发了政府回应。
为掌控移动互联网浏览器市场而打响的战斗还引发了有关Facebook的问题,这家公司规模庞大的IPO(首次公开招股)交易遭遇了不良的回应,而现在则正在探索一项移动战略。有报道称,Facebook很可能将收购挪威浏览器开发商Opera Software,这能解决这家社交网络巨头所感知到的一些问题,原因是收购Opera将可为Facebook提供一个平台,使其能为定位广告获取有关移动互联网使用量的更好数据。
席尔瓦指出,如果Facebook决定收购Opera,或是与Opera展开合作,又或是开发自己的浏览器,那么他都“不会对此感到惊讶”。
席尔瓦还称,另一家需要关注的移动互联网浏览器市场参与者是,这家公司已经为其Kindle互联网设备开发了自己的浏览器——此举还能引导用户使用各种服务,从而赚取更多利润。他指出,象其他公司一样,亚马逊也正在追寻一项战略,这项战略不仅将硬件和软件涵盖在内,同时还能出售产品和服务。
席尔瓦指出:“亚马逊既拥有内容,又出售产品,还拥有网络服务。亚马逊拥有大量资产,而且已经取得了成功。我将会关注这家公司。”
31这里有一个搜集了关于JS游戏引擎开辟库的一个列表,转过去。对于使用JS和HTML5做的一些小游戏,对法式员职业的一些倡议,可拜见《HTML5 小游戏展示...
这里有一个搜集了关于JS游戏引擎开辟库的一个列表,转过去。对于使用JS和HTML5做的一些小游戏,,可拜见《HTML5 小游戏展示》
Latest Release
The Render Engine
跨阅读器; 大范围 API; 开源.?2
CC BY-SA 2.5
和 jQuery 一路使用
Tile based
Classic Repro
基于JS+HTML5的街机气概的游戏?3
The Javascript 2D Game Engine
重视于重力、物理、碰撞检测方面,使用HTML5 Canvas 和IE的ExplorerCanvas 低CPU耗损.?4
The GMP Javascript Game Engine
重视于数度的操纵简化,”easy to learn and use”?5
轻量级和模块化。?6
Effect Games
PropulsionJS
使用 HTML5 Canvas.?7
Apache 2.0
尚未released。利用 GWT 和 HTML5。存眷于Linux和Mac OS上的Web游戏开辟。8
还在开发过程当中
cssgameengine
用于初学者。
jsGameSoup
Javascript Gamelib
Sarien.net interpreter
2D Adventure
Isogenic Engine
2.5D Platform
Tom’s Halls
基于 DHTML, 在停息中
Commercial ($99)
Rocket Engine
Commercial
Commercial?
CommonJs; 能够和 RingoJs server 整合,很像 PyG 仅撑持C
Tile based
DemoPort of Flixel (Flash) to JS.?Announcement thread.
Commercial (free version too)
JS backend
比拟起老练的游戏引擎来讲,这些引擎不包罗诸如AI、声音、游戏逻辑、收集等等功效,不外,你可使用此外一些JS库来帮助结束这些功用。
Latest Release
CopperLicht
由Haxe编纂成?JS
http://code.谷歌.com/p/box2dweb/? 由?Box2D移植成 JS
Latest Release
Created with goal of having common JS framework for dsktop and web.?1
SoundManager2
Mootools Canvas Library (MCL)
HTML5 Canvas Library
Layered Canvas Library (LCL)
Artisan.js
没有保护了
测验考试像Flash的DisplayList 同样在 Canvas 上建立图形。
processing.js
toxiclibsjs
和 processing.js 连系和很好
注重,文件尺寸比力并未必精确,由于有些lib并无紧缩过。
Stackblur? 在 Canvas 上完成恍惚的结果
Pixastic? 简略的图片操作
Rapha?l? 停止一些矢量图和一些转变操纵,能看这篇文章
CamanJS? Canvas上的一些滤镜
CanvasContext2DWrapper? Method chaining for Canvas
WebGLU? WebGL helpers
color.js? 色彩办理东西。 MIT
Sylvester? 数组和矩阵
PlayMyCode? 在线游戏社区。利用 Quby (像Ruby) 编译成JavaScript.
Sphere RPG Engine? 为 RPG 游戏计划。使用 JavaScript
playtomic? Commercial service providing analytics, leaderboards etc. services for games. Provides HTML5/JS API in addition to AS2/AS3 ones.
日 –一些杂项资本
日 –游戏Flash vs HTML5
日 –HTML5 小游戏展现
日 –Web版的VNC
日 –几个Web的资源
日 –把Flash转成Javascript/HTML5
日 –一段Javascript的代码
31是否看到过FLash的3D旋转?不必在感到惊讶了,有了Cloud Carousel,简单易用,最新的版本是1.0.5,支持IE9的新特性,HTML5,旋转模式改成了“Canvas”,运动更加流畅。同时在...
是否看到过FLash的3D旋转?不必在感到惊讶了,有了Cloud Carousel,简单易用,最新的版本是1.0.5,支持IE9的新特性,HTML5,旋转模式改成了“Canvas”,运动更加流畅。同时在(IE6-IE9, Firefox (incl V4), Chrome, Opera, Safari)等浏览器中测试过,都能很好的支持。还支持鼠标滑轮切换,的确值得赞叹和收藏!查看效果
[voosee:start:img] src="/d/file/shared/jquery//b644dec690ea.jpg" alt="3d-Carousel.jpg" width="620" height="420"[voosee:end:img]
&div id = “carousel1″ style=”width:256 height:128background:#000;overflow:”&
&img class = “cloudcarousel” src=”/images/carousel/flags/flag1.png” alt=”Flag 1 Description” title=”Flag 1 Title” /&
&img class = “cloudcarousel” src=”/images/carousel/flags/flag2.png” alt=”Flag 2 Description” title=”Flag 2 Title” /&
&img class = “cloudcarousel” src=”/images/carousel/flags/flag3.png” alt=”Flag 3 Description” title=”Flag 3 Title” /&
&img class = “cloudcarousel” src=”/images/carousel/flags/flag4.png” alt=”Flag 4 Description” title=”Flag 4 Title” /&
&input id=”left-but” type=”button” value=”Left” /&
&input id=”right-but” type=”button” value=”Right” /&
&p id=”title-text”&&/p&
&p id=”alt-text”&&/p&
&script type=”text/javascript” src=”/ajax/libs/jquery/1.4.2/jquery.min.js”&&/script&
&script type=”text/JavaScript” src=”/js/cloud-carousel.1.0.0.js”&&/script&
$(document).ready(function(){
$(“#carousel1″).CloudCarousel(
xPos: 128,
buttonLeft: $(“#left-but”),
buttonRight: $(“#right-but”),
altBox: $(“#alt-text”),
titleBox: $(“#title-text”)
参数详解:现在显示的值就为默认值。
reflHeight:0, //倒影的高度,单位是像素
reflOpacity:0.5, //倒影透明度(0-1)
reflGap:0, //图片与倒影之间的间隙,单位是像素
minScale:0.5, //缩放比例
xPos:0, //X轴偏移,一般设置成外框的一半,也就是实例中“#carousel1”的宽度的一半
yPos:0, //Y轴偏移,这个可以自己调试看看,很直观的
xRadius:0, //旋转幅度的水平半径,这个是猜的
yRadius:0, //旋转幅度的垂直半径,这个是猜的,因为旋转的路径是个椭圆,你明白的
altBox:null, //显示图片alt属性的样式名称
titleBox:null, //显示图片title属性的样式名称
FPS: 30, //我猜是旋转运动的步长
autoRotate: ‘no’, //是否自动播放,设置“left”或者“right”即可自动播放
autoRotateDelay: 1500, //播放延时
speed:0.2, //播放速度(0.1 ~ 0.3之间)
mouseWheel: false, //是否支持滑轮,需要加在jQuery滑轮插件,官方的地址不见了,可以用百度“jquery.mousewheel”即可
bringToFront: false, //这个参数设置为true,就是表示点击相应的图片,滚动到当前展示,一般是不打开自动播放时
buttonLeft: ”, //控制向左的按钮
buttonRight: ” //控制向右的按钮
官网地址:
4泡泡网软件频道5月28日 近日,国内著名的云存储平台酷盘WEB版升级,除重新设计了WEB文件列表、相册、分享和账号设置等界面外,新版本还支持HTML5...
泡泡网软件频道5月28日 近日,国内著名的云存储平台酷盘WEB版升级,除重新设计了WEB文件列表、相册、分享和账号设置等界面外,新版本还支持HTML5拖拽上传。
酷盘此次改版,在很大程度上简化了用户的操作流程,使得文件的上传、下载、共享等操作变得更简捷,工作效率更高。
界面重新布局
新版界面除对原界面做了大幅度调整,使得整个界面看上去清爽简洁,更易于用户快速找到自己的文件和要执行的操作按钮外,还对某些功能项做了有效地处理。比如,先前当我们在文件列表中勾选要操作的文件后,相应的功能(如“共享文件夹”、“打包下载”、“重命名”和“删除”、“移动”等)会出现在界面的右下方,不符合我们的操作习惯,现在会显示在列表上方,要进行何种操作一目了然。
[voosee:start:img] src="//.jpg" alt=""[voosee:end:img]
支持HTML5拖拽上传
此外,新版本还支持HTML5拖拽上传。如果你使用的是Chrome、Firefox、Safari等支持HTML5的浏览器,只需在进入酷盘WEB界面后,将要上传的文件直接拖拽到文件列表中,即可完成文件的上传工作。
上传信息一目了然
默认情况下,酷盘会将上传的文件保存在酷盘根目录下,如果你想将其保存到某个文件夹中,可以先在文件列表中勾选该文件夹,然后再用鼠标拖拽文件到文件列表。
有关上传的速度、进度和剩余时间等信息,可在界面下方看到。
[voosee:start:img] src="//.jpg" alt=""[voosee:end:img]
据悉,目前酷盘已完成了对Web、Windows、iPhone、iPad、Android、Symbian、Mac等几乎所有平台的支持,是当前国内支持平台最多且文件同步速度最快的云存储平台。其中对Mac平台的支持为业内领先,深受广大果粉用户的青睐。■
2饼图、柱状图、线图和许多其他的图形是非常重要的用来表示数据和沟通的信息,并可展示两个实体之间的关系。而这些图形如果用在 Web 上则有助...
饼图、柱状图、线图和许多其他的图形是非常重要的用来表示数据和沟通的信息,并可展示两个实体之间的关系。而这些图形如果用在 Web 上则有助于吸引访客的注意力,并有效地解释相关数据。 在这里我们推荐一些很棒的工具,你可以通过点击创建非常直观的设计流程图和图表。
使用 Gliffy 可创建非常漂亮的各种图表、流程图、平面图和技术图纸等等。
[voosee:start:img] src="http://www.oschina.net/uploads/img/20024_IWnL.jpg" alt="Gliffy"[voosee:end:img]
Highcharts是一个制作图表的纯Javascript类库,主要特性如下:
兼容性:兼容当今所有的浏览器,包括iPhone、IE和火狐等等;
对个人用户完全免费;
纯JS,无BS;
支持大部分的图表类型:直线图,曲线图、区域图、区域曲线图、柱状图、饼装图、散布图;
跨语言:不管是PHP、Asp.net还是Java都可以使用,它只需要三个文件:一个是Highcharts的核心文件highcharts.js,还有a canvas emulator for IE和Jquery类库或者MooTools类库;
提示功能:鼠标移动到图表的某一点上有提示信息;
放大功能:选中图表部分放大,近距离观察图表;
易用性:无需要特殊的开发技能,只需要设置一下选项就可以制作适合自己的图表;
时间轴:可以精确到毫秒;
[voosee:start:img] src="http://www.oschina.net/uploads/img/20026_Ecou.jpg" alt="Highcharts"[voosee:end:img]
这是一个用来创建柱状图的工具。
[voosee:start:img] src="http://www.oschina.net/uploads/img/20027_JLSQ.jpg" alt="Barchart"[voosee:end:img]
完全使用 Flash 和 XML 构建的图表生成工具。
[voosee:start:img] src="http://www.oschina.net/uploads/img/20027_9kkw.jpg" alt="CSS Chart Generator"[voosee:end:img]
非常易用,可点击箭头来创建列,点击标题和数字来修改标题和单位,可右键打印图表。
[voosee:start:img] src="http://www.oschina.net/uploads/img/20028_J8PN.jpg" alt="Grapher"[voosee:end:img]
生成动态图表
[voosee:start:img] src="http://www.oschina.net/uploads/img/20029_XPL0.jpg" alt="Hohli Charts"[voosee:end:img]
Ajax MGraph 基于
的 Ajax 图表库,纯 XHTML 和 CSS 实现。
[voosee:start:img] src="http://static.oschina.net/uploads/img/20749_eSxH.jpg" alt="MGraph"[voosee:end:img]
< 是一个在线多用户、实时协作的流程图服务
[voosee:start:img] src="http://www.oschina.net/uploads/img/20031_KuQa.jpg" alt="Flowchart"[voosee:end:img]
这是一个最棒的在线图表生成工具,支持三维的图表
[voosee:start:img] src="http://www.oschina.net/uploads/img/a.jpg" alt="Online Chart Generator"[voosee:end:img]
DIY (Do it yourself) Chart 是一个基于 Web 的简单但强大的在线工具,用来创建交互式的 Web 图表。
[voosee:start:img] src="http://www.oschina.net/uploads/img/20033_uawG.jpg" alt="DIY Chart"[voosee:end:img]
XML/SWF Charts 是一个简单但很强大的创建各种吸引人的图表的工具,使用 XML 作为数据传输,使用 Flash 做图表展示。
[voosee:start:img] src="http://www.oschina.net/uploads/img/20035_8FsG.jpg" alt="XML/SWF Charts"[voosee:end:img]
Cacoo 是一个用户友好的在线图形绘制工具,可创建各种 UML、线框以及网络图。可免费使用!
[voosee:start:img] src="http://www.oschina.net/uploads/img/20039_VVPb.jpg" alt="Cacoo"[voosee:end:img]
这里包含很多种形式的图表,无需附加插件,无需图片支持。
[voosee:start:img] src="http://www.oschina.net/uploads/img/20042_SS4i.jpg" alt="ChartDemo"[voosee:end:img]
你可通过 ChartGizmo 的免费帐号为网站创建各种图表。
[voosee:start:img] src="http://www.oschina.net/uploads/img/20044_u6bj.jpg" alt="ChartGizmo"[voosee:end:img]
[voosee:start:img] src="http://www.oschina.net/uploads/img/20045_hEo9.jpg" alt="CreateAGraph"[voosee:end:img]
Draw Anywhere 提供在线的组织结构图、调度和展示图的绘制工具
[voosee:start:img] src="http://www.oschina.net/uploads/img/20046_5gFA.jpg" alt="DrawAnywhere"[voosee:end:img]
一个简单的工具用来创建各种效果的饼图
[voosee:start:img] src="http://www.oschina.net/uploads/img/20048_pzBa.jpg" alt="Piecolor"[voosee:end:img]
[voosee:start:img] src="http://www.oschina.net/uploads/img/20049_pVMe.jpg" alt="Online chart tool"[voosee:end:img]
yed 是一个画流程图的工具,不是开源软件,但是可以让你摆脱 Microsoft Office Visio
,也有linux下的版本,整个程序是java开发的,确实比较强大。
[voosee:start:img] src="http://www.oschina.net/uploads/img/20051_o6DI.jpg" alt="YEd Graph Editor"[voosee:end:img]
Pie Chart Maker 是一个免费的构建饼图的工具
[voosee:start:img] src="http://www.oschina.net/uploads/img/20055_vyPe.jpg" alt="Pie Chart Maker"[voosee:end:img]
Plot and gr lines, circles, parabolas, cubics.
[voosee:start:img] src="http://www.oschina.net/uploads/img/2.jpg" alt="Fooplot"[voosee:end:img]
SmartDraw 是一个桌面软件用来绘制各种图表、UML图等。
[voosee:start:img] src="http://www.oschina.net/uploads/img/20057_C7gF.jpg" alt="SmartDraw"[voosee:end:img]
文章转载自:开源中国社区 []
20转载地址:.cn/s/blog_yy47.html
作者:沉默的野狼
&!DOCTYPE HTML&
&meta charset=”utf-8″&
&title&无标题文档&/title&
&script type=”text/javascript” src=”http://api./api?v=1.3...
转载地址:
作者:沉默的野狼
&!DOCTYPE HTML&
&meta charset=”utf-8″&
&title&无标题文档&/title&
&script type=”text/javascript” src=”&
&script type=”text/javascript”&
function getLocation()
if(navigator.geolocation){
navigator.geolocation.getCurrentPosition(showMap, handleError, {enableHighAccuracy:true, maximumAge:1000});
alert(“您的浏览器不支持使用HTML 5来获取地理位置服务”);
function showMap(value)
var longitude = value.coords.
var latitude = value.coords.
var map = new BMap.Map(“map”);
var point = new BMap.Point(longitude, latitude);
// 创建点坐标
map.centerAndZoom(point, 15);
var marker = new BMap.Marker(new BMap.Point(longitude, latitude));
// 创建标注
map.addOverlay(marker);
// 将标注添加到地图中
function handleError(value)
switch(value.code){
alert(“位置服务被拒绝”);
alert(“暂时获取不到位置信息”);
alert(“获取信息超时”);
alert(“未知错误”);
function init()
getLocation();
window.onload =
&div id=”map” style=”width:600height:600”&&/div&
效果如图:
本实例需要配置一个应用服务器,我用的是TOMCAT,用ECLIPSE新建了一个WEB工程,然后发布到TOMCAT下才可以看到效果。具体的可以上网找一下相关资料,很多的。
0在HTML5规范中,我最喜欢的Web技术就是正迅速变得流行的WebSocket API。WebSocket提供了一个受欢迎的技术,以替代我们过去几年一直在用的Ajax技术。这个新的API提...
在HTML5规范中,我最喜欢的Web技术就是正迅速变得流行的WebSocket API。WebSocket提供了一个受欢迎的技术,以替代我们过去几年一直在用的Ajax技术。这个新的API提供了一个方法,从客户端使用简单的语法 有效地推动消息到服务器。让我们看一看HTML5的WebSocket API:它可用于客户端、服务器端。而且有一个优秀的第三方API,名为Socket.IO。
一、什么是WebSocket API?
WebSocket API是下一代客户端-服务器的异步通信方法。该通信取代了单个的TCP套接字,使用ws或wss协议,可用于任意的客户端和服务器程序。 WebSocket目前由W3C进行标准化。WebSocket已经受到Firefox 4、Chrome 4、Opera 10.70以及Safari 5等浏览器的支持。
WebSocket API最伟大之处在于服务器和客户端可以在给定的时间范围内的任意时刻,相互推送信息。WebSocket并不限于以Ajax(或XHR)方式通信,因为 Ajax技术需要客户端发起请求,而WebSocket服务器和客户端可以彼此相互推送信息;XHR受到域的限制,而WebSocket允许跨域通信。
Ajax技术很聪明的一点是没有设计要使用的方式。WebSocket为指定目标创建,用于双向推送消息。
二、WebSocket API的用法
只专注于客户端的API,因为每个服务器端语言有自己的API。下面的代码片段是打开一个连接,为连接创建事件监听器,断开连接,消息时间,发送消息返回到服务器,关闭连接。
// 创建一个Socket实例
var socket = new WebSocket(‘ws://localhost:8080′);
// 打开Socket
socket.onopen = function(event) {
// 发送一个初始化消息
socket.send(‘I am the client and I\’m listening!’);
// 监听消息
socket.onmessage = function(event) {
console.log(‘Client received a message’,event);
// 监听Socket的关闭
socket.onclose = function(event) {
console.log(‘Client notified socket has closed’,event);
// 关闭Socket….
//socket.close()
让我们来看看上面的初始化片段。参数为URL,ws表示WebSocket协议。onopen、onclose和onmessage方法把事件连接到Socket实例上。每个方法都提供了一个事件,以表示Socket的状态。
onmessage事件提供了一个data属性,它可以包含消息的Body部分。消息的Body部分必须是一个字符串,可以进行序列化/反序列化操作,以便传递更多的数据。
WebSocket的语法非常简单,使用WebSockets是难以置信的容易……除非客户端不支持WebSocket。IE浏览器目前不支持WebSocket通信。如果你的客户端不支持WebSocket通信,下面有几个后备方案供你使用:
Flash技术 —— Flash可以提供一个简单的替换。 使用Flash最明显的缺点是并非所有客户端都安装了Flash,而且某些客户端,如iPhone/iPad,不支持Flash。
AJAX Long-Polling技术 —— 用AJAX的long-polling来模拟WebSocket在业界已经有一段时间了。它是一个可行的技术,但它不能优化发送的信息。也就是说,它是一个解决方案,但不是最佳的技术方案。
由于目前的IE等浏览器不支持WebSocket,要提供WebSocket的事件处理、返回传输、在服务器端使用一个统一的API,那么该怎么办呢?幸运的是,Guillermo Rauch创建了一个Socket.IO技术。
三、带Socket.IO的WebSocket
Socket.IO 是Guillermo Rauch创建的WebSocket API,Guillermo Rauch是LearnBoost公司的首席技术官以及LearnBoost实验室的首席科学家。Socket.IO使用检测功能来判断是否建立 WebSocket连接,或者是AJAX long-polling连接,或Flash等。可快速创建实时的应用程序。Socket.IO还提供了一个NodeJS API,它看起来非常像客户端API。
建立客户端Socket.IO
Socket.IO可以从GitHub下载,可以把socket.io.js文件包含到页面中:
&script src=”http://cdn.socket.io/stable/socket.io.js”&&/script&
此时,Socket.IO在此页面上是有效的,是时候创建Socket了:
// 创建Socket.IO实例,建立连接
var socket= new io.Socket(‘localhost’,{
port: 8080
socket.connect();
// 添加一个连接监听器
socket.on(‘connect’,function() {
console.log(‘Client has connected to the server!’);
// 添加一个连接监听器
socket.on(‘message’,function(data) {
console.log(‘Received a message from the server!’,data);
// 添加一个关闭连接的监听器
socket.on(‘disconnect’,function() {
console.log(‘The client has disconnected!’);
// 通过Socket发送一条消息到服务器
function sendMessageToServer(message) {
socket.send(message);
Socket.IO简化了WebSocket API,统一了返回运输的API。传输包括:
Flash Socket
AJAX long-polling
AJAX multipart streaming
JSONP polling
你还可以设置任意的Socket.IO构造器的第二个选项,选项包括:
port – 待连接的端口
transports – 一个数组,包含不同的传输类型
transportOptions – 传输的参数使用的对象,带附加属性
Socket.IO还提供了由本地WebSocket API提供的普通连接、断开连接、消息事件。Socket还提供了封装每个事件类型的方法。
四、NodeJS和Socket.IO联合开发
Socket.IO提供的服务器端解决方案,允许统一的客户端和服务器端的API。使用Node,你可以创建一个典型的HTTP服务器,然后把服务器的实例传递到Socket.IO。从这里,你创建连接、断开连接、建立消息监听器,跟在客户端一样。
一个简单的服务器端脚本看起来如下:
// 需要HTTP 模块来启动服务器和Socket.IO
var http= require(‘http’), io= require(‘socket.io’);
// 在8080端口启动服务器
var server= http.createServer(function(req, res){
// 发送HTML的headers和message
res.writeHead(200,{ ‘Content-Type’: ‘text/html’ });
res.end(‘&h1&Hello Socket Lover!&/h1&’);
server.listen(8080);
// 创建一个Socket.IO实例,把它传递给服务器
var socket= io.listen(server);
// 添加一个连接监听器
socket.on(‘connection’, function(client){
// 成功!现在开始监听接收到的消息
client.on(‘message’,function(event){
console.log(‘Received message from client!’,event);
client.on(‘disconnect’,function(){
clearInterval(interval);
console.log(‘Server has disconnected’);
你可以运行服务器部分,假定已安装了NodeJS,从命令行执行:
node socket-server.js
现在客户端和服务器都能来回推送消息了!在NodeJS脚本内,可以使用简单的JavaScript创建一个定期消息发送器:
// 创建一个定期(每5秒)发送消息到客户端的发送器
var interval= setInterval(function() {
client.send(‘This is a message from the server! ‘ + new Date().getTime());
服务器端将会每5秒推送消息到客户端!
五、dojox.Socket和Socket.IO
Persevere的创建者Kris Zyp创建了dojox.Socket。dojox.Socket以Dojo库一致的方式封装了WebSocket API,用于在客户端不支持WebSocket时,使用long-polling替代。
下面是怎样在客户端使用dojox.Socket和在服务器端使用Socket.IO的例子:
var args, ws= typeof WebSocket!= ‘undefined’;
var socket= dojox.socket(args= {
url: ws? ‘/socket.io/websocket’ : ‘/socket.io/xhr-polling’,
‘Content-Type’:&#39;application/x-www-urlencoded’
transport: function(args, message){
args.content = // use URL-encoding to send the message instead of a raw body
dojo.xhrPost(args);
var sessionId;
socket.on(‘message’, function(){
if (!sessionId){
sessionId=
args.url += ‘/’ + sessionId;
}else if(message.substr(0, 3) == ‘~h~’){
// a heartbeat
dojox.socket.Reconnect还创建了在套接字失去连接时自动重连。期待包含dojox.Socket的Dojo 1.6版本早日发布。
六、实际应用和WebSocket资源
有很多WebSocke的实际应用。WebSocket对于大多数客户机-服务器的异步通信是理想的,在浏览器内聊天是最突出的应用。WebSocket由于其高效率,被大多数公司所使用。
0作为下一代的 Web 标准,HTML5 拥有许多引人注目的新特性,如 Canvas、本地存储、多媒体编程接口、WebSocket 等等。这其中有“Web 的 TCP ”之称的 WebSocket 格外吸引开发人员的注意...
作为下一代的 Web 标准,HTML5 拥有许多引人注目的新特性,如 Canvas、本地存储、多媒体编程接口、WebSocket 等等。这其中有“Web 的 TCP ”之称的 WebSocket 格外吸引开发人员的注意。WebSocket 的出现使得浏览器提供对 Socket 的支持成为可能,从而在浏览器和服务器之间提供了一个基于 TCP 连接的双向通道。Web 开发人员可以非常方便地使用 WebSocket 构建实时 web 应用,开发人员的手中从此又多了一柄神兵利器。本文首先介绍 HTML5 WebSocket 的基本概念以及这个规范试图解决的问题,然后介绍 WebSocket 的基本原理和编程接口。接下来会通过一个简单案例来示范怎样实现一个 WebSocket 应用,并且展示 WebSocket 如何在功能强大和编程简单易用上达到的完美统一。最后介绍了目前主流浏览器对 WebSocket 支持的状况、局限性以及未来的展望。
Web 应用的信息交互过程通常是客户端通过浏览器发出一个请求,服务器端接收和审核完请求后进行处理并返回结果给客户端,然后客户端浏览器将信息呈现出来,这种机制对于信息变化不是特别频繁的应用尚能相安无事,但是对于那些实时要求比较高的应用来说,比如说在线游戏、在线证券、设备监控、新闻在线播报、RSS 订阅推送等等,当客户端浏览器准备呈现这些信息的时候,这些信息在服务器端可能已经过时了。所以保持客户端和服务器端的信息同步是实时 Web 应用的关键要素,对 Web 开发人员来说也是一个难题。在 WebSocket 规范出来之前,开发人员想实现这些实时的 Web 应用,不得不采用一些折衷的方案,其中最常用的就是轮询 (Polling) 和 Comet 技术,而 Comet 技术实际上是轮询技术的改进,又可细分为两种实现方式,一种是长轮询机制,一种称为流技术。下面我们简单介绍一下这几种技术:
这是最早的一种实现实时 Web 应用的方案。客户端以一定的时间间隔向服务端发出请求,以频繁请求的方式来保持客户端和服务器端的同步。这种同步方案的最大问题是,当客户端以固定频率向服务器发起请求的时候,服务器端的数据可能并没有更新,这样会带来很多无谓的网络传输,所以这是一种非常低效的实时方案。
长轮询是对定时轮询的改进和提高,目地是为了降低无效的网络传输。当服务器端没有数据更新的时候,连接会保持一段时间周期直到数据或状态改变或者时间过期,通过这种机制来减少无效的客户端和服务器间的交互。当然,如果服务端的数据变更非常频繁的话,这种机制和定时轮询比较起来没有本质上的性能的提高。
流技术方案通常就是在客户端的页面使用一个隐藏的窗口向服务端发出一个长连接的请求。服务器端接到这个请求后作出回应并不断更新连接状态以保证客户端和服务器端的连接不过期。通过这种机制可以将服务器端的信息源源不断地推向客户端。这种机制在用户体验上有一点问题,需要针对不同的浏览器设计不同的方案来改进用户体验,同时这种机制在并发比较大的情况下,对服务器端的资源是一个极大的考验。
综合这几种方案,您会发现这些目前我们所使用的所谓的实时技术并不是真正的实时技术,它们只是在用 Ajax 方式来模拟实时的效果,在每次客户端和服务器端交互的时候都是一次 HTTP 的请求和应答的过程,而每一次的 HTTP 请求和应答都带有完整的 HTTP 头信息,这就增加了每次传输的数据量,而且这些方案中客户端和服务器端的编程实现都比较复杂,在实际的应用中,为了模拟比较真实的实时效果,开发人员往往需要构造两个 HTTP 连接来模拟客户端和服务器之间的双向通讯,一个连接用来处理客户端到服务器端的数据传输,一个连接用来处理服务器端到客户端的数据传输,这不可避免地增加了编程实现的复杂度,也增加了服务器端的负载,制约了应用系统的扩展性。
HTML5 WebSocket 设计出来的目的就是要取代轮询和 Comet 技术,使客户端浏览器具备像 C/S 架构下桌面系统的实时通讯能力。 浏览器通过 JavaScript 向服务器发出建立 WebSocket 连接的请求,连接建立以后,客户端和服务器端就可以通过 TCP 连接直接交换数据。因为 WebSocket 连接本质上就是一个 TCP 连接,所以在数据传输的稳定性和数据传输量的大小方面,和轮询以及 Comet 技术比较,具有很大的性能优势。Websocket.org 网站对传统的轮询方式和 WebSocket 调用方式作了一个详细的测试和比较,将一个简单的 Web 应用分别用轮询方式和 WebSocket 方式来实现,在这里引用一下他们的测试结果图:
[voosee:start:img] src="/developerworks/cn/web/1112_huangxa_websocket/image002.jpg" alt="图 1. 轮询和 WebSocket 实现方式的网络负载对比图" width="504" height="360"[voosee:end:img]
通过这张图可以清楚的看出,在流量和负载增大的情况下,WebSocket 方案相比传统的 Ajax 轮询方案有极大的性能优势。这也是为什么我们认为 WebSocket 是未来实时 Web 应用的首选方案的原因。
WebSocket 协议本质上是一个基于 TCP 的协议。为了建立一个 WebSocket 连接,客户端浏览器首先要向服务器发起一个 HTTP 请求,这个请求和通常的 HTTP 请求不同,包含了一些附加头信息,其中附加头信息”Upgrade: WebSocket”表明这是一个申请协议升级的 HTTP 请求,服务器端解析这些附加的头信息然后产生应答信息返回给客户端,客户端和服务器端的 WebSocket 连接就建立起来了,双方就可以通过这个连接通道自由的传递信息,并且这个连接会持续存在直到客户端或者服务器端的某一方主动的关闭连接。
下面我们来详细介绍一下 WebSocket 规范,由于这个规范目前还是处于草案阶段,版本的变化比较快,我们选择 draft-hixie-thewebsocketprotocol-76版本来描述 WebSocket 协议。因为这个版本目前在一些主流的浏览器上比如 Chrome,、FireFox、Opera 上都得到比较好的支持,您如果参照的是新一些的版本话,内容可能会略有差别。
一个典型的 WebSocket 发起请求和得到响应的例子看起来如下:
客户端到服务端:
GET /demo HTTP/1.1
Connection: Upgrade
Sec-WebSocket-Key2:
Upgrade: WebSocket
Sec-WebSocket-Key1: 4@1 46546xW%0l 1 5
[8-byte security key]
服务端到客户端:
HTTP/1.1 101 WebSocket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
WebSocket-Origin:
WebSocket-Location: ws:///demo
[16-byte hash response]
这些请求和通常的 HTTP 请求很相似,但是其中有些内容是和 WebSocket 协议密切相关的。我们需要简单介绍一下这些请求和应答信息,”Upgrade:WebSocket”表示这是一个特殊的 HTTP 请求,请求的目的就是要将客户端和服务器端的通讯协议从 HTTP 协议升级到 WebSocket 协议。从客户端到服务器端请求的信息里包含有”Sec-WebSocket-Key1”、“Sec-WebSocket-Key2”和”[8-byte securitykey]”这样的头信息。这是客户端浏览器需要向服务器端提供的握手信息,服务器端解析这些头信息,并在握手的过程中依据这些信息生成一个 16 位的安全密钥并返回给客户端,以表明服务器端获取了客户端的请求,同意创建 WebSocket 连接。一旦连接建立,客户端和服务器端就可以通过这个通道双向传输数据了。
在实际的开发过程中,为了使用 WebSocket 接口构建 Web 应用,我们首先需要构建一个实现了 WebSocket 规范的服务器,服务器端的实现不受平台和开发语言的限制,只需要遵从 WebSocket 规范即可,目前已经出现了一些比较成熟的 WebSocket 服务器端实现,比如:
Kaazing WebSocket Gateway — 一个 Java 实现的 WebSocket Server
mod_pywebsocket — 一个 Python 实现的 WebSocket Server
Netty —一个 Java 实现的网络框架其中包括了对 WebSocket 的支持
node.js —一个 Server 端的 JavaScript 框架提供了对 WebSocket 的支持
如果以上的 WebSocket 服务端实现还不能满足您的业务需求的话,开发人员完全可以根据 WebSocket 规范自己实现一个服务器。在“WebSocket 实战”这一节,我们将使用 Microsoft .NET 平台上的 C# 语言来打造一个简单的 WebSocket 服务器,继而构建一个简单的实时聊天系统。
上一节介绍了 WebSocket 规范,其中主要介绍了 WebSocket 的握手协议。握手协议通常是我们在构建 WebSocket 服务器端的实现和提供浏览器的 WebSocket 支持时需要考虑的问题,而针对 Web 开发人员的 WebSocket JavaScript 客户端接口是非常简单的,以下是 WebSocket JavaScript 接口的定义:
[Constructor(in DOMString url, in optional DOMString protocol)]
interface WebSocket {
readonly attribute DOMString URL;
// ready state
const unsigned short CONNECTING = 0;
const unsigned short OPEN = 1;
const unsigned short CLOSED = 2;
readonly attribute unsigned short readyS
readonly attribute unsigned long bufferedA
//networking
attribute F
attribute F
attribute F
boolean send(in DOMString data);
void close();
WebSocket implements EventT
其中 URL 属性代表 WebSocket 服务器的网络地址,协议通常是”ws”,send 方法就是发送数据到服务器端,close 方法就是关闭连接。除了这些方法,还有一些很重要的事件:onopen,onmessage,onerror 以及 onclose。我们借用 Nettuts 网站上的一张图来形象的展示一下 WebSocket 接口:
[voosee:start:img] src="/developerworks/cn/web/1112_huangxa_websocket/image003.gif" alt="图 2. WebSocket JavaScript 接口" width="443" height="234"[voosee:end:img]
下面是一段简单的 JavaScript 代码展示了怎样建立 WebSocket 连接和获取数据:
wsServer = 'ws://localhost:8888/Demo';
websocket = new WebSocket(wsServer);
websocket.onopen = function (evt) { onOpen(evt) };
websocket.onclose = function (evt) { onClose(evt) };
websocket.onmessage = function (evt) { onMessage(evt) };
websocket.onerror = function (evt) { onError(evt) };
function onOpen(evt) {
console.log("Connected to WebSocket server.");
function onClose(evt) {
console.log("Disconnected");
function onMessage(evt) {
console.log('Retrieved data from server: ' + evt.data);
function onError(evt) {
console.log('Error occured: ' + evt.data);
下面是主流浏览器对 HTML5 WebSocket 的支持情况:
Supported in version 4+
Supported in version 4+
Internet Explorer
Supported in version 10+
Supported in version 10+
Supported in version 5+
这一节里我们用一个案例来演示怎么使用 WebSocket 构建一个实时的 Web 应用。这是一个简单的实时多人聊天系统,包括客户端和服务端的实现。客户端通过浏览器向聊天服务器发起请求,服务器端解析客户端发出的握手请求并产生应答信息返回给客户端,从而在客户端和服务器之间建立连接通道。服务器支持广播功能,每个聊天用户发送的信息会实时的发送给所有的用户,当用户退出聊天室时,服务器端需要清理相应用户的连接信息,避免资源的泄漏。以下我们分别从服务器端和客户端来演示这个 Web 聊天系统的实现,在实现方式上我们采用了 C# 语言来实现 WebSocket 服务器,而客户端是一个运行在浏览器里的 HTML 文件。
这个聊天服务器的实现和基于套接字的网络应用程序非常类似,首先是服务器端要启动一个套接字监听来自客户端的连接请求,关键的区别在于 WebSocket 服务器需要解析客户端的 WebSocket 握手信息,并根据 WebSocket 规范的要求产生相应的应答信息。一旦 WebSocket 连接通道建立以后,客户端和服务器端的交互就和普通的套接字网络应用程序是一样的了。所以在下面的关于 WebSocket 服务器端实现的描述中,我们主要阐述 WebSocket 服务器怎样处理 WebSocket 握手信息,至于 WebSocket 监听端口的建立,套接字信息流的读取和写入,都是一些常用的套接字编程的方式,我们就不多做解释了,您可以自行参阅本文的附件源代码文件。
在描述 WebSocket 规范时提到,一个典型的 WebSocket Upgrade 信息如下所示:
GET /demo HTTP/1.1
Connection: Upgrade
Sec-WebSocket-Key2:
Upgrade: WebSocket
Sec-WebSocket-Key1: 4@1 46546xW%0l 1 5
[8-byte security key]
其中 Sec-WebSocket-Key1,Sec-WebSocket-Key2 和 [8-byte security key] 这几个头信息是 WebSocket 服务器用来生成应答信息的来源,依据 draft-hixie-thewebsocketprotocol-76 草案的定义,WebSocket 服务器基于以下的算法来产生正确的应答信息:
逐个字符读取 Sec-WebSocket-Key1 头信息中的值,将数值型字符连接到一起放到一个临时字符串里,同时统计所有空格的数量;
将在第 1 步里生成的数字字符串转换成一个整型数字,然后除以第 1 步里统计出来的空格数量,将得到的浮点数转换成整数型;
将第 2 步里生成的整型值转换为符合网络传输的网络字节数组;
对 Sec-WebSocket-Key2 头信息同样进行第 1 到第 3 步的操作,得到另外一个网络字节数组;
将 [8-byte security key] 和在第 3,第 4 步里生成的网络字节数组合并成一个 16 字节的数组;
对第 5 步生成的字节数组使用 MD5 算法生成一个哈希值,这个哈希值就作为安全密钥返回给客户端,以表明服务器端获取了客户端的请求,同意创建 WebSocket 连接
至此,客户端和服务器的 WebSocket 握手就完成了,WebSocket 通道也建立起来了。下面首先介绍一下服务器端实现是如何根据用户传递的握手信息来生成网络字节数组的。.NET 平台提供了很方便的对字符串,数值以及数组操作的函数,所以生成字节数组的方法还是非常简单明了的,代码如下:
private byte[]   BuildServerPartialKey(string clientKey)
string partialServerKey = "";
byte[] currentK
int spacesNum = 0;
char[] keyChars = clientKey.ToCharArray();
foreach (char currentChar in keyChars)
if (char.IsDigit(currentChar)) partialServerKey += currentC
if (char.IsWhiteSpace(currentChar)) spacesNum++;
currentKey = BitConverter.GetBytes((int)(Int64.Parse(partialServerKey)
/ spacesNum));
if (BitConverter.IsLittleEndian) Array.Reverse(currentKey);
if (currentKey!= null) Array.Clear(currentKey, 0, currentKey.Length);
return currentK
得到网络字节数组以后,服务器端生成 16 位安全密钥的方法如下所示:
private byte[] BuildCompleteServerKey(byte[] serverKey1, byte[] serverKey2,
byte[] last8Bytes)
byte[] concatenatedKeys = new byte[16];
Array.Copy(serverKey1, 0, concatenatedKeys, 0, 4);
Array.Copy(serverKey2, 0, concatenatedKeys, 4, 4);
Array.Copy(last8Bytes, 0, concatenatedKeys, 8, 8);
System.Security.Cryptography.MD5 MD5Service =
System.Security.Cryptography.MD5.Create();
puteHash(concatenatedKeys);
整个实现是非常简单明了的,就是将生成的网络字节数组和客户端提交的头信息里的 [8-byte security key] 合并成一个 16 位字节数组并用 MD5 算法加密,然后将生成的安全密钥作为应答信息返回给客户端,双方的 WebSocekt 连接通道就建立起来了。实现了 WebSocket 握手信息的处理逻辑,一个具有基本功能的 WebSocket 服务器就完成了。整个 WebSocket 服务器由两个核心类构成,一个是 WebSocketServer,另外一个是 SocketConnection,出于篇幅的考虑,我们不介绍每个类的属性和方法了,文章的附件会给出详细的源代码,有兴趣的读者可以参考。
服务器刚启动时的画面如下:
[voosee:start:img] src="/developerworks/cn/web/1112_huangxa_websocket/image004.jpg" alt="图 3. WebSocket 服务器刚启动的画面" width="437" height="124"[voosee:end:img]
客户端可以依据这个信息填写聊天服务器的连接地址,当有客户端连接到聊天服务器上时,服务器会打印出客户端和服务器的握手信息,每个客户的聊天信息也会显示在服务器的界面上,运行中的聊天服务器的界面如下:
[voosee:start:img] src="/developerworks/cn/web/1112_huangxa_websocket/image005.jpg" alt="图 4. 有客户端连接到 WebSocket 服务器的" width="408" height="217"[voosee:end:img]
以上我们简单描述了实现一个 WebSocket 服务器的最基本的要素,下一节我们会描述客户端的实现。
客户端的实现相对于服务器端的实现来说要简单得多了,我们只需要发挥想象去设计 HTML 用户界面,然后呼叫 WebSocket JavaScript 接口来和 WebSocket 服务器端来交互就可以了。当然别忘了使用一个支持 HTML5 和 WebSocket 的浏览器,在笔者写这篇文章的时候使用的浏览器是 Firefox。客户端的页面结构是非常简洁的,初始运行界面如下:
[voosee:start:img] src="/developerworks/cn/web/1112_huangxa_websocket/image006.jpg" alt="图 5. 聊天室客户端初始页面" width="353" height="260"[voosee:end:img]
当页面初次加载的时候,首先会检测当前的浏览器是否支持 WebSocket 并给出相应的提示信息。用户按下连接按钮时,页面会初始化一个到聊天服务器的 WebSocekt 连接,初始化成功以后,页面会加载对应的 WebSocket 事件处理函数,客户端 JavaScript 代码如下所示:
function ToggleConnectionClicked() {
if (SocketCreated && (ws.readyState == 0 || ws.readyState == 1)) {
ws.close();
Log(&准备连接到聊天服务器 ...&);
new WebSocket(&ws://& + document.getElementById(&Connection&).value);
SocketCreated =
} catch (ex) {
Log(ex, &ERROR&);
document.getElementById(&ToggleConnection&).innerHTML = &断开&;
ws.onopen = WSonO
ws.onmessage = WSonM
ws.onclose = WSonC
ws.onerror = WSonE
function WSonOpen() {
Log(&连接已经建立。&, &OK&);
$(&#SendDataContainer&).show(&slow&);
function WSonMessage(event) {
Log(event.data);
function WSonClose() {
Log(&连接关闭。&, &ERROR&);
document.getElementById(&ToggleConnection&).innerHTML = &连接&;
$(&#SendDataContainer&).hide(&slow&);
function WSonError() {
Log(&WebSocket错误。&, &ERROR&);
当用户按下发送按钮,客户端会调用WebSocket对象向服务器发送信息,并且这个消息会广播给所有的用户,实现代码如下所示:
function SendDataClicked()
if (document.getElementById("DataToSend").value != "") {
ws.send(document.getElementById("txtName").value + "说 :\"" +
document.getElementById("DataToSend").value + "\"");
document.getElementById("DataToSend").value = "";
如果有多个用户登录到聊天服务器,客户端页面的运行效果如下所示:
[voosee:start:img] src="/developerworks/cn/web/1112_huangxa_websocket/image007.jpg" alt="图 6. 聊天客户端运行页面" width="415" height="307"[voosee:end:img]
至此我们已经完成了一个完整的 WebSocket 客户端实现,用户可以体验一下这个聊天室的简单和快捷,完全不用考虑页面的刷新和繁琐的 Ajax 调用,享受桌面程序的用户体验。WebSocket 的强大和易用可见一斑,您完全可以在这个基础上加入更多的功能,设计更加漂亮的用户界面,切身体验 WebSocket 的震撼力。完整的客户端代码请参阅附件提供的源代码。
WebSocket 的优点已经列举得很多了,但是作为一个正在演变中的 Web 规范,我们也要看到目前用 Websocket 构建应用程序的一些风险。首先,WebSocket 规范目前还处于草案阶段,也就是它的规范和 API 还是有变动的可能,另外的一个风险就是微软的 IE 作为占市场份额最大的浏览器,和其他的主流浏览器相比,对 HTML5 的支持是比较差的,这是我们在构建企业级的 Web 应用的时候必须要考虑的一个问题。
本文介绍了 HTML5 WebSocket 的横空出世以及它尝试解决的的问题,然后介绍了 WebSocket 规范和 WebSocket 接口,以及和传统的实时技术相比在性能上的优势,并且演示了怎样使用 WebSocket 构建一个实时的 Web 应用,最后我们介绍了当前的主流浏览器对 HTML5 的支持情况和 WebSocket 的局限性。不过,我们应该看到,尽管 HTML5 WebSocket 目前还有一些局限性,但是已经是大势所趋,微软也明确表达了未来对 HTML5 的支持,而且这些支持我们可以在 Windows 8 和 IE10 里看到,我们也在各种移动设备,平板电脑上看到了 HTML5 和 WebSocket 的身影。WebSocket 将会成为未来开发实时 Web 应用的生力军应该是毫无悬念的了,作为 Web 开发人员,关注 HTML5,关注 WebSocket 也应该提上日程了,否则我们在新一轮的软件革新的浪潮中只能做壁上观了。
source.zip
22近些年来,用户对视觉体验的要求不断提高,而设计师们也开始在网页设计中加入各种特效元素以满足用户的需求。其中有一种特效的效果很具...
近些年来,用户对视觉体验的要求不断提高,而设计师们也开始在网页设计中加入各种特效元素以满足用户的需求。其中有一种特效的效果很具有吸引力,它就是错位视觉滚动效果。错位视觉滚动(Parallax Scrolling)是指让多层背景以不同的速度移动,形成立体的运动效果,可以带来非常出色的视觉体验。
随着这种炫酷的效果首次在Nike 2011年的 Nike Better World 项目中完美展现,如今这种错位视觉滚动效果被越来越多的国外网站所应用,成为Web设计的热点趋势。因此,本文整理了十种关于此效果的教程和插件和大家分享,希望为你的网站设计提供一些灵感。
不过有两个方面需要读者注意:
以大量图片为特色的网站应该考虑图像的预加载问题,以便为用户提供更好更流畅的视觉体验;
某些网站页面在移动设备上的效果可能较之在PC上有所不同,一些功能也可能无法正常使用。
一个超级棒的插件,为你的网站提供纵深和滑动效果。
[voosee:start:img] src="http://www.iguoguo.net/wp-content/uploads/auto_save_image/851R2Q.jpg" alt=""[voosee:end:img]
一份帮助你增加网页立体层次感的教程。
[voosee:start:img] src="http://www.iguoguo.net/wp-content/uploads/auto_save_image/855vYm.jpg" alt=""[voosee:end:img]
一份为那些急切想重现NIKE网站滚动效果的设计师准备的教程。
[voosee:start:img] src="http://www.iguoguo.net/wp-content/uploads/auto_save_image/856X6g.jpg" alt=""[voosee:end:img]
一份为那些想在此领域了解的更深的设计师准备的例子和教程。
[voosee:start:img] src="http://www.iguoguo.net/wp-content/uploads/auto_save_image/857Dfn.jpg" alt=""[voosee:end:img]
一份教程,在背景上帮你添加一些滚动的云彩。
[voosee:start:img] src="http://www.iguoguo.net/wp-content/uploads/auto_save_image/859mAx.jpg" alt=""[voosee:end:img]
用一个动画式的网页头部来让你的访问者为你欢呼吧!
[voosee:start:img] src="http://www.iguoguo.net/wp-content/uploads/auto_save_image/901twL.jpg" alt=""[voosee:end:img]
一份错位视觉效果和内容同时出现的有趣的教程。
[voosee:start:img] src="http://www.iguoguo.net/wp-content/uploads/auto_save_image/902VqA.jpg" alt=""[voosee:end:img]
一个通过重复和动画运动产生立体错觉的插件。
[voosee:start:img] src="http://www.iguoguo.net/wp-content/uploads/auto_save_image/904RzL.jpg" alt=""[voosee:end:img]
一个为任何滚动元素提供错位视觉滚动效果的JQuery插件。
[voosee:start:img] src="http://www.iguoguo.net/wp-content/uploads/auto_save_image/906CmK.jpg" alt=""[voosee:end:img]
允许你嵌入一个类似于幕布升起的效果到你的网页中。
[voosee:start:img] src="http://www.iguoguo.net/wp-content/uploads/auto_save_image/908qK7.jpg" alt=""[voosee:end:img]
英文原文:
14新浪科技讯 北京时间5月28日早间消息,消息人士透露,Facebook正在开发自主的智能手机产品,并计划明年推出。通过推出智能手机,Facebook将避免退化为其...
新浪科技讯 北京时间5月28日早间消息,消息人士透露,Facebook正在开发自主的智能手机产品,并计划明年推出。通过推出智能手机,Facebook将避免退化为其他移动平台上的应用。
招聘苹果前工程师
谷歌上周完成了对摩托罗拉移动的收购,未来有可能自行生产智能手机。而另一家互联网巨头Facebook也有可能推出自主的智能手机产品。
Facebook员工和一些知情人士表示,Facebook计划明年推出智能手机,该公司已经招聘了多名曾参与过iPhone项目的苹果前软件工程师和硬件工程师,此外还有一人曾参与过iPad项目。
根据消息人士的说法,这将是Facebook第三次尝试开发智能手机。2010年,美国科技博客TechCrunch报道称,Facebook正开发一款智能手机。然而随着Facebook意识到其中的困难,这一项目随后被放弃。去年再次有媒体报道称,Facebook将与HTC合作开发智能手机,代号为“Buffy”。这一项目目前仍在进行中。
Facebook正在深化智能手机的开发。该公司扩大了Buffy项目团队,并开始探索其他的智能手机项目。Facebook还组建了一支经验丰富的智能手机硬件工程师团队。
一名曾供职于苹果的工程师表示,他曾与Facebook CEO马克·扎克伯格(Mark Zuckerberg)会面,而扎克伯格问到了与智能手机相关的一些深入问题。该工程师表示,扎克伯格的问题包括手机中使用什么样的芯片,而他问这样的问题似乎并不仅仅是出于个人兴趣。
Facebook拒绝对开发智能手机的传闻置评。该公司在此前的一份声明中表示,将致力于探索整个移动产业,包括与运营商、硬件厂商、操作系统提供商和应用开发者的合作。
新的营收来源
对Facebook来说,开发智能手机的动机很明确。作为一家刚刚上市的公司,Facebook需要找到新的营收来源。而Facebook也不愿在移动行业的竞争中落后,因为这一行业是最具增长前景的领域之一。
Facebook一名员工表示:“扎克伯格担心,如果他近期未能开发出手机产品,那么Facebook有可能退化为其他移动平台上的一个应用。”
Facebook的智能手机项目一直处于保密中。Facebook甚至没有在网站上公布相关的招聘信息,而是通过线下推荐的方式,找到适合智能手机项目的人才。
硬件开发中的难题
不过,作为一家社交网络公司,Facebook能否开发出成功的硬件仍遭到外界的质疑。硬件和软件的设计文化完全不同。除苹果之外,几乎没有任何厂商能很好地同时开发软件和硬件。消费电子行业的一些大公司此前也遭遇了失败,包括惠普、戴尔和索尼。
苹果前硬件经理、Electric Imp创始人胡戈·费恩斯(Hugo Fiennes)表示:“硬件开发不是一蹴而就的。在智能手机中,即使进行很小的改动,你也可能完全改变了天线的工作方式。除非你有一定的积累,否则你完全不知道这些。”他指出,开展手机业务非常复杂。
Facebook也面临自己的问题。Twitter已被集成至iPhone中,用户可以无缝地发送Twitter消息。而Facebook和苹果的关系则并不是非常融洽,Facebook应用也没有被整合到iOS系统中。
Facebook一名员工表示,手机项目已重新启动很多次,因为Facebook最初认为可以凭内部力量开发出成功的硬件产品。然而Facebook随后意识到,该公司仍需要有手机开发经验的工程师。因此,Facebook招聘了硬件工程师并与一家手机厂商合作,设计Facebook手机的外形、风格和内部工作方式。
尽管遭遇了一些困难,但Facebook在进军智能手机市场的过程中仍处于有利地位。Facebook已拥有一个完整的操作系统,其中包括消息、日程表、联系人和视频等应用,此外Facebook也拥有应用商店服务,提供了数千款热门应用。Facebook近期还收购了照片分享服务Instagram。
RIM和HTC或为收购目标
如果Facebook自己的工程师团队未能获得成功,Facebook还可以收购一家智能手机公司。Facebook刚刚从IPO(首次公开招股)中获得160亿美元收入,因此可以很容易地收购类似RIM的公司。RIM当前市值已不到60亿美元。HTC目前的市值为118亿美元,而这一数字还在不断下降中。
在开发智能手机时,Facebook并不一定会与苹果形成直接竞争,而更有可能对谷歌发起挑战。Facebook瞄准的目标也是廉价智能手机。
Gartner副总裁卡罗丽娜·米拉内西(Carolina Milanesi)表示:“当你推出基于广告的手机时,你将瞄准所有对价格敏感的预付费用户。”她表示,在大众市场,谷歌和Facebook都可以采用类似亚马逊的策略,即提供类似Kindle的廉价硬件产品,并通过广告来补贴成本。
谷歌和Facebook均通过广告获得收入,它们有机会在智能手机屏幕上向用户展示广告,而当前的主要问题在于采用什么样的方式达到这一目的。(邱越)

我要回帖

更多关于 crafty 的文章

 

随机推荐