RealtimeWebRealtimeWeb实时信息流推实时信息流推送送聂永yong.boy@gmail.comhttp://www.blogjava.net/yongboy/提纲•推送实现技术/历程•客户端如何选择•Java支持现状•socket.io•RealtimeWebJavaAppletsJavaApplets客户端脚本–java.net.socket建立Socket连接–要求本地安装JRE,不够轻量–微软和Sun公司不作为,已淡出人们视野轮询(Polling)•简单易用,容易实现•所有浏览器都支持•短连接•每次请求,立刻返回•JSONPPolling可跨域•ScripttagPolling可跨域缺点:•建立大量连接•服务器端并发压力大•很少被使用到示范代码varpolling=function(){$.get("getServerTime",function(data){$("#result").html(""+data+"");},"text");}setInterval(polling,10000);//每10秒请求一次轮询-工作机制长轮询(LongPolling)•Http1.1Connection:keep-alive长连接协议•服务器端数据就绪可立即返回•服务器若未就绪,连接不断开,等待一段时间•表现形式:XMLHttpRequestScripttagLongPollingJSONP流程图1.服务器端阻塞/挂起请求直到数据到达或超时,然后返回2.客户端处理服务器返回消息,再次发起请求3.在客户端建立连接所消耗期间,服务器端新数据需要暂时缓存XMLHttpRequestLongPolling•形式自由简单,采用较多•错误处理、超时管理可控性强•默认无法跨域•采用跨域资源共享CORS可部分实现跨域•浏览器支持CROS情况http://caniuse.com/cors•head("Access-Control-Allow-Origin","*")示范代码functioninitGet(){$.get("getNextTimeAsync").success(function(resp){log(resp);}).error(function(){log("ERROR!");}).done(initGet);//重新发起新的请求}//执行请求initGet();ScripttagLongPolling•表现形式:•可跨域•风险:无法控制因跨域产生返回函数的执行(一个站点系无此担忧)•一般应用于同一级域名,不同二级域名搭配使用•可使用JSONP规避此javascript风险•很棒的入门资料:Comet(longpolling)forallbrowsersusingScriptCommunicator示范代码客户端:varurl='scriptTagDemo?time='+newDate().getTime();varon_success=function(){doRequst();//执行成功后,重新发起请求};varon_error=function(){alert("Somethingwentwrong!");};vardoRequst=function(){ScriptCommunicator.sourceJavaScript(url,on_success,on_error);};doRequst();服务器端返回:ScriptCommunicator.callback_called=true;$('#div').html('NowTime:2012-08-2209:58:04078');轮询VS长轮询•短轮询一般定时请求•长轮询一般在上一次轮询完成之后,发起下一个新的请求•AJAX长轮询时,最好标注超时时间•服务器端处理方式有所不同流推送(Streaming)•客户端一次连接,服务器数据可多次推送•低延迟通信相对经济的单向通道选择•实现方案:HiddeniFrame(iframe+htmlfile)XMLHttpRequestStreaming•浏览器Streaming兼容性测试请求流程HiddeniFrame+XMLHttpRequestStreaming类似,但输出稍有差别HiddeniFrame•隐藏iframe+htmlfile组成•服务器发送chunked编码数据块•每个数据块即一段javascript代码•通过javascript渲染页面数据•各个浏览器都支持iframe•在IE、Firefox下面效果最好•不可跨域•缺点:错误处理可控性不强客户端响应XMLHttpRequestStreaming•XMLHttpRequest以流的形式输出•浏览器需要支持的multi-part标志•跨域资源共享(Cross-OriginResourceSharing)简称CROPS可实现Ajax跨域•支持浏览器不多•进阶阅读:Servlet3.0笔记之异步请求Comet推送XMLHttpRequest示范CROS支持情况•http://caniuse.com/#feat=corsCometCometisawebapplicationmodelinwhichalong-heldHTTPrequestallowsawebservertopushdatatoabrowser,withoutthebrowserexplicitlyrequestingit.-WikiPedia基于HTTP长连接的“服务器推”技术,是一种新的Web应用架构。基于这种架构开发的应用中,服务器端会主动以异步的方式向客户端程序推送数据,而不需要客户端显式的发出请求...