s相信大家都知道校内网或开心网的消息提醒功能,只要有人留言给你,就会在已经打开的页面的右下角弹出提示,对于这个,我想自己实现。想出了如下方案:
1.前提是不用定时器轮询机制,利用ajax+java servlet监听器。我是这么想的。ajax只能用于一个客户端和服务器的通信,因为它的传递载体是request和response,如果想达到客户端A和客户端B的实时提醒效果,是不可能的。所以,我是这么想的,如果有两个客户端A和B,首先,A和B都要向用于监听器的那个页面发送ajax请求,如果B发给A一个留言,那么点击发送按钮的同时,用一种方式产生一个监听器能够监听的事件,然后当监听器的监听事件响应之后,再根据发送对象,向发送对象发出ajax的response响应。
  但是这个是不可能的。有这么几个问题可以毁灭我的上面的想法:首先,一个servlet相当于一个类,每一个客户端都能得到这个servlet的实例。也就是说A和B向那个监听器发送ajax请求,实际上是向各自的servlet实例去请求,那么某个servlet实例无法看到不属于自己的客户端发出的ajax请求。其次,我知识浅薄,目前认为“再根据发送对象,向发送对象发出ajax的response响应。”这句话不可能,ajax对象的创建,找来找去就是那几句代码,用js可以用一个var ajax[]=。。。来存储这些对象,然后可以遍历这些对象,但是用java呢?要想根据这些对象,首先要将js创建的这些ajax对象能够用java语言取出来,然后放到集合里面或数组里面,但是ajax对象是属于什么基本类型呢?你定义的这个数组或是集合总要有个类型才能存放xmlhttprequest这个activobject啊,同时,就算可以有一种方法将这些对象搜集到一起,但是,怎么把它们放到application对象中?因为application对象里面的东西在任何客户端都能看见,这是必要的。或者说,一个普通的网页请求,无论get还是post,能传递一个xmlhttprequest作为请求页面的参数吗?然后再在请求页面用request.getParameter()访问?我不会。

2.上面的设想我否定掉了,下面的想法是基于ocx的,我想,用C++编写一个聊天程序,可以用socket编程啊,然后将这个类似于QQ的程序打包成ocx,放到网页上不就ok了吗。但是存在如下问题:网页是http协议,soket是基于tcp/ip协议的,将后者放到前者中,这样可以吗?我没试过。还有,既然主体是基于IP的,那么在一台电脑上打开两个同学的校内网,那么这两个同学岂不是享受不到校内的消息提醒功能了吗?我倒没试过。因为我听说校内网可以用火狐浏览器也能享受到这样的功能,那么证明他应该不是用ocx方法,因为ocx只有ie浏览器才能用。

3.老老实实的用定时器轮询机制。这应该是最忠实的办法,但是会带来一个问题:1秒轮询一次,别的程序不运行啦?30秒运行一次,提醒会延迟。首先,原始的轮询我想也是基于ajax,客户端通过定时器不断向远程服务器发送请求,那个被请求的页面每次收到请求后,检测数据库有无变化,比如你的留言表里面是不是多了一条记录。有变化的话,response.getwriter().write,否则啥也不做。

还有一种方法,利用多线程。这个我正在琢磨。利用多线程,可以将这个轮询请求当作一个线程来处理,这样就不打扰其他页面的正常操作。我想到这个是因为想到一个同事的毕业设计,用的是flex,有个页面老是在动,我问这个是怎么实现的,他说,是根据数据库的变化而实时在页面访问,用多线程的。。。当然,我没学过flex,不过即将要学的,我买的一本云计算的书,里面有个云脑系统就是用flex实现页面的。

总之,这是我的想法,我现在打算先研究多线程,没办法的情况下老老实实的轮询,但是这是我最不想的。我相信这个可以通过事件触发的!当然我一定要实现!因为我下面的一个项目用到这种功能可以锦上添花!当然,我的废话太多了,恳请高手们能够谈谈自己对校内网的提醒功能的看法,好吗?
posted on 2009-10-08 22:01  王小涛  阅读(5057)  评论(33编辑  收藏  举报