浏览 12656 次
锁定老帖子 主题:服务器推送技术
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-04-09
我是一名新入行的JAVA程序员,刚进公司就遇到一个BS架构的系统有客户端数据即时更新需求的问题,前面有想过用Ajax定时刷新局部数据的方法,这样并发用户多的话就造成系统开销过大,后来在网上查出采用以下方案可以解决此问题,但还未曾测试保持socket连接当并发用户多起来的时候会怎样,这里与大家分享一下,如果有好的方案希望们不要吝啬,多多指教,在此谢过! 结合JavaScript帧间通信和一个管理网络通信的Java Applet,用推送技术解决这个问题。 在服务器端,创建另一个类的实例响应Socket连接请求,并为每一个新的连接请求创建一个新的线程。每一个线程只检查数据文件是否改变。如果数据文件已经改变,则线程读取文件内容,并把新的数据发送给已经连接的Applet(示例应用把整个文件发送给Applet)。 在客户端,一个隐藏帧包含了上面提到的Applet。Applet实现了连接服务器的功能,并实现了一个简单的通信协议。建立与服务器的连接之后,Applet接收来自服务器的数据,并调用JavaScript函数把数据传入文档。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-04-09
google pushlet
|
|
返回顶楼 | |
发表时间:2007-04-09
楼上的大哥能不能说的详细一点,或者告诉小弟从哪里能找到这种类似的例子,非常感谢
|
|
返回顶楼 | |
发表时间:2007-04-09
你的方案有几个明显的问题:
1. 通过Applet透过非HTTP通道通信, 对防火墙和代理服务器不友好, 有可能连不通. 2. 服务器端响应Applet链接的做法最好不要自己实现, 如果真要这么做, 最好还是基于成熟的解决方案, 开源的像 http://www.quickserver.org/ 看起来不错的. 3. 如果真要自己做Socket服务器, 也真的不能来一个请求开一个线程, 对服务器压力过大. 这种一般都是做线程池. 而且连接最好通过NIO, 比BIO的并发支持能力强得不是一点半点. 这个需求我的感觉比较合适的还是cometd, 虽然还不是那么成熟标准的协议, 但在这个方向上是很有潜力的一个候选. 不过我也还没有去用过, 只是大概了解. AJAX ServerPush基本原理大概都是基于HTTP, 有一个连接不断的去轮询服务器, 但服务器端并不是立即返回, 而是等待一定的时间 (这个时间一般是30秒, 要保证不超过两边配置的TCP连接超时间隔, 不然就被超时中断了), 如果服务器端没有新事件和数据, 就等这么长时间再返回; 而等待过程中如果有新的消息要发给客户端, 就立即将新数据返回给客户端. 这样就实现了有新事件的时候客户端可以立刻获得通知的效果. 但是由于浏览器一般限制到同一服务器的http连接最多两个, 所以不可能在一个网站上给客户端跑超过一个这样的轮询连接, 否则其他资源就没法下载了. 所以就需要COMETD这样的协议框架, 去占用一个轮询连接, 实现多个页面或组件的消息多路分发. 另外因为服务器端响应这种轮询连接的时候必须等待, 传统的J2EE架构, 每request一线程单次处理写回response的模式就非常不适, 因为很快就会导致线程池爆满, 却多数都是空闲占用. 不要低估操作系统调度线程的性能开销, 其实 nio 对比 多线程bio 的性能提高, 源头基本就在这里. Jetty6内核重新用nio写过了, tomcat6听说也已经上nio了. 不过Server Push相关的支持一时肯定不会出现在JavaEE规范里, 所以还只能仰赖于他们各自的专有接口. Jetty6已经支持cometd, 同时还有自己的ajax解决方案, 可以去多研究研究它的适用性. |
|
返回顶楼 | |
发表时间:2007-04-09
首先非常感谢你的建议,我也上了你留给我的那个网站,可是都是全英文的,小弟我才疏学浅看不懂,如果您所说的线程池以及服务器端SOCKET用其他的技术来做的话,我一时半会怕很难上手,因为项目也比较急,请问大哥有没有这种案例的代码,能否发给我一份,小弟在此谢过了!
|
|
返回顶楼 | |
发表时间:2007-04-09
用pushlets可以实现服务器端推数据,可以在页面中嵌入一个pushlet iframe, 接受服务端推送过来的javascript代码,来实现页面的更新。它本身有一个session管理,可以实现单播及广播。可以上它的官方网站上看看Demo。
|
|
返回顶楼 | |
发表时间:2007-04-09
to blackj:
有没有别人已经做好的例子供参考啊? |
|
返回顶楼 | |
发表时间:2007-04-10
dilaomimi 写道 首先非常感谢你的建议,我也上了你留给我的那个网站,可是都是全英文的,小弟我才疏学浅看不懂,如果您所说的线程池以及服务器端SOCKET用其他的技术来做的话,我一时半会怕很难上手,因为项目也比较急,请问大哥有没有这种案例的代码,能否发给我一份,小弟在此谢过了!
这个恐怕也很难有合适的参考例子, http://wow.dev.java.net 可以下载WoW的源码, 是我做的; 不过如果还没有这方面的经验, 门槛也还是比较高的, 而且也都是英文的. WoW还算不上完全的ServerPush, 是间歇轮询的方式, 所以客户端更新有时会有一定的延迟. 我能想到的最简单的例子还是Jetty里面带的, 建议下载了研究研究. |
|
返回顶楼 | |
发表时间:2007-04-11
http://dev.dschini.org/socketjs/
这个地方有一个用flash连接 socket,然后用js拿数据的东西,跟java applet功能估计差不多。 楼主也可一试。 |
|
返回顶楼 | |