- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Java技术推送push技术
Java 技术推送 push 技术
服务器推送技术的基础思想是将浏览器主动查询信息改为服务器主动发送信息,服务器发送一批数据,浏览器显示消息,
同时保证与服务器的连接,当服务器需要再一次的发送数据,浏览器显示数据并保持连接。
comet 基于 HTTP 长连接技术,无需安装插件。
comet :一个概念,web push
pushlet :comet 的一个实现。
就是保持长连接的策略问题,有人用jquery 写了相应的 util
Pushlet 基于 HTTP 流,这种技术常常用在多媒体视频、通讯应用中,比如 QuickTime。与装载 HTTP 页面之后马
上关闭 HTTP 连接的做法相反,Pushlet 采用 HTTP 流方式将新变动的数据主动地推送到 client (客户端),再此
期间 HTTP 连接一直保持打开。有关如何在 Java 中实现这种 Keep-alive 的长连接请参看 Sun 提供的《HTTP
Persistent Connection》和W3C 的《HTTP1.1 规范》
Tomcat 的 comet 原理其实同样很简单,它无非就是做了一件事情,它允许 servlet 执行完毕后的 response 没有
被回收,我们只要拿到这个 Reponse 的引用并保存起来,就可以随时从 Server 向Client 端 Push 数据了。每个连
接一个线程的模型便非常简单。该模型对于 Comet 不大适用,但是,Java 对此同样有解决的办法。为了有效地
处理 Comet ,需要非阻塞IO ,Java 通过它的 NIO 库提供非阻塞 IO。两种最流行的开源服务器 Apache Tomcat
和 Jetty 都利用 NIO 增加非阻塞 IO ,从而支持Comet.
而非阻塞 I/O 和同步 I/O 最明显的不同就是同步 I/O 所有可能被阻塞的地址在非阻塞 I/O 中都不会被阻塞。如在读
取数据时,如果数据暂时无法被读取。那么在非阻塞 I/O 中会立刻返回,以便程序可以执行其他的代码,然后系统
会不断侦测这个未完成的读取操作,直到可以继续读数据时再来完成这个操作。非阻塞式 IO 的出现的目的就是为了
解决这个瓶颈。而非阻塞式 IO 是怎么实现的呢?非阻塞 IO 处理连接的线程数和连接数没有联系,也就是说处理
10000 个连接非阻塞 IO 不需要 10000 个线程,你可以用 1000 个也可以用 2000 个线程来处理。因为非阻塞 IO 处
理连接是异步的。当某个连接发送请求到服务器,服务器把这个连接请求当作一个请求事件 ,并把这个事件分
配给相应的函数处理。我们可以把这个处理函数放到线程中去执行,执行完就把线程归还。这样一个线程就可以异
步的处理多个事件。而阻塞式 IO 的线程的大部分时间都浪费在等待请求上了。
在 comet 中,为了保持长连接,如果使用阻塞时 IO ,则不可避免的对每一个连接保持一个线程。不同于短连接,
线程可以及时释放。长连接对应的线程可能永远不能释放,这样一个 server 能够服务的客户端的数量就受到了线程
数量上限的限制。而使用 NIO 可以伺候多个连接而不必要保持相应数量的线程。就解决了这个问题。
Tomcat 提供了 CometProcessor 接口,有这种特定标记的 Servlet ,Tomcat 会做特殊处理,Tomcat 不会把它当
做普通 Servlet 实行完毕后,会回收 request 和 response。注意:实现 CometProcessor 接口后不用在 servlet 中
写 doGet,doPoset 方法,所有事件在 BEGIN,READ,END,ERROR 中实现。
从 event 拿到的 request 和 response 不会在 begin 和 end/error 之间不会被释放,一直有效。可以用来传递消息。
Note that the response object and dependent OutputStream and Writer are still not synchronized, so
文档评论(0)