首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

用java兑现comet,基于HTTP长连接的实现,用于从服务端实时发送信息到客户端

2012-11-01 
用java实现comet,基于HTTP长连接的实现,用于从服务端实时发送信息到客户端?参考文档 http://www.ibm.com/d

用java实现comet,基于HTTP长连接的实现,用于从服务端实时发送信息到客户端

?参考文档 http://www.ibm.com/developerworks/cn/web/wa-lo-comet/

?

????????comet是HTTP长连接,就是在HTTP发送请求时,服务器不立刻发送响应信息给客户端, 而是保持着连接,等待一定情况发生后才把数据发送回去给客户端。所以用comet可以实现服务器端的数据实时地发送给客户端。

????????本文主要是用java和js来简单地实现comet,最后附上源码和使用例子。

????????在客户端用XMLRequest发送请求到服务器,在服务器端用一个servlet来接收XMLRequest的请求,当接收到请求时,并不立刻响应客户端,而是把该servlet线程阻塞,等到一定事件发生后,再响应客户端。当客户端接收到服务端的响应后,调用自定义的回调函数来处理服务器发送回来的数据,处理完成后,再发送一个XMLRequest请求到服务端,这样循环下去,就可以实现数据的实时更新,又不必要在客户端不断地轮循(polling)。

?????????利用该comet的实现(以后简称为keeper)时,只要在客户端注册事件和写一个处理返回数据的回调函数,然后在服务端实现keeper中的EventListener接口,调用Controller.action(eventListener,eventType)就可以了。

????????keeper分成两大部分,第一部分为客户端的javascript,第二部分是服务端的servlet和事件处理。

????????一.客户端

????????建立一个XMLRequest对象池,每发送一次请求,从对象池中取一个XMLRequest对象,如果没有可用的对象,则创建一个,把它加入到对象池中。这部分的代码来自于网络。

????????为了使用方便,再添加一些方法,用来注册事件。这样只要调用注册函数来注册事件,并且把回调函数传给注册事件函数就行了,处理数据的事情,交给回调函数,并由用户来实现。

????????keeper为了方便使用,把客户端的javascript代码集成在servlet中,当配置好keeper的servlet,启动HTTP服务器时,keeper会根据用户的配置,在相应的目录下生成客户端的javascript代码。

????二.服务端

????????服务端的servlet初始化时,根据配置来生成相应的客户端javascript代码。

????????servlet的入口由keeper.servlet.Keeper.java中的doGet进入。在Keeper的doGet中,从请求中获取用户注册事件的名称(字符串类型),然后根据事件的名称,构造一个事件(Event类型),再把它注册到NameRegister中,注册完成后,该servlet线程调用wait(),把自已停止。等待该servlet线程被唤醒后,从Event中调用事件的EventListener接口的process(request,response)来处理客户端的请求。

????????

?

?

????????3.编写事件处理代码,消息的处理代码如下:

????

    ????protected?void?doPost(HttpServletRequest?request,?HttpServletResponse?response)?throws?ServletException,?IOException?{
  1. ????????System.out.println("Post.."); ????????String?msg?=?request.getParameter("msg");
  2. ????????Controller.action(new?SendMsg(msg),"msg"); ????}

    class?SendMsg?implements?EventListener{
  1. ????private?String?msg; ????public?SendMsg(String?msg)?{
  2. ????????this.msg?=?msg; ????}
  3. ????@Override ????public?void?process(HttpServletRequest?request,?HttpServletResponse?response)?{
  4. ????????response.setCharacterEncoding("UTF-8"); ????????PrintWriter?out?=?null;
  5. ????????try?{ ????????????out?=?response.getWriter();
  6. ????????????if(msg!=null){ ????????????????out.write(msg);
  7. ????????????} ????????}?catch?(IOException?e)?{???
  8. ????????????e.printStackTrace(); ????????}
  9. ????????finally{ ????????????if(out?!=?null)?{
  10. ????????????????out.close(); ????????????}
  11. ????????}??????? ????}
  12. }

?

?

?到这时,一个基本的keeper应用就完成了。其它部分请参考附件中的例子源码。

1 楼 flypeace 2008-12-15   刚跑过demo,发现在firefox里面可以,在ie6和ie7都不可以,好象js发送功能在ie里面不管用了 2 楼 czx566 2008-12-15   推荐TIBCo的 AMS

简单~ 3 楼 homelink 2008-12-15   czx566 写道
推荐TIBCo的 AMS 简单~

是TIBCo EMS(TIBCO Enterprise Message Service)吗? 4 楼 czx566 2008-12-15   homelink 写道czx566 写道
推荐TIBCo的 AMS 简单~

是TIBCo EMS(TIBCO Enterprise Message Service)吗?
不好意思,我以为AMS是开源的~因为GI是开源的
但刚才我问了AMS非开源~

所以我现在不推荐AMS~

不是EMS 5 楼 fzfx88 2009-10-14   跑了一下程序,比较精辟,收益匪浅。。。

谢谢分享。。。 6 楼 朗拿颠老 2009-10-14   谁知道webQQ 浏览器和server长连接原理??是不是和这个一样用阻塞? 7 楼 朗拿颠老 2009-10-14   长时间不响应不会超时吗? 8 楼 fhp0917 2009-10-26   IE不支持ajax的长连接
9 楼 itcyt 2012-08-20   貌似程序跑不了

热点排行