我做的系统中需要实现一个消息发送和接受功能。类似于CSDN的消息提醒。如果有人回你的贴,后台就会立即提醒你收到了消息,你登陆的时候会有未读消息提示。我用QuartZ实现定时器功能。然后主要的问题在:利用DWR的反推Ajax,将消息推送到客户端,问题在于,怎样推将消息推送到目的客户端。比如客户的main.jsp是目的地。例如客户A登陆了系统,他可以接受到自己的消息。或当他在操作过程中,有消息产生了,消息立即推送到客户A的main.jsp。因为存在多个客户同时登陆,访问main.jsp,那如何才能传递到客户A的main.jsp呢???本人是第一次做消息功能,有很多问题不太明白。望高手解答....还有就是DWR的Ajax反推功能,我有现成的示例代码。但是对于其中的机制不太明白。我希望有人分析下反推Ajax的机制,不要贴示例代码,我想知道原理。我谈谈我的一点想法吧,这个消息的目的main.jsp可能和jsessionid有关吧。是不是可以在用户登陆的时候,将用户的sessionid和用户id做成映射放在map中。当一个消息产生时,从map中判断消息接受人是否登陆,登陆了就可以吧消息发送到目的main.jsp。是不是这个目的main.jsp是要靠sessionid来识别??

解决方案 »

  1.   

    我做梦都梦到这个帖子,up ,up,up!帮帮我啊..
      

  2.   


    用DWR里面有一个变量scriptsession存储相关信息,相当于你的map,先从服务器取得scriptsession ,再对其中你存储的变量做相关操作。2.0里面是这样的,后面的版本没有去看过了。
      

  3.   

    不知道你梦没梦到俺..
    反推 我不知道有没有这个词 我比较在意你说的一点 就是
    问题在于,怎样推将消息推送到目的客户端。比如客户的main.jsp是目的地
    实际上并没有反推这一说 都是客户端不停的请求后台 查询是否有新的记录 如果有 就返回 主动方不可能会是服务端
      

  4.   

    哈哈,有的!普通的Ajax是只能客户端发送请求,服务端回应。但是DWR实现了由服务器端向客户端推送的ajax。
      

  5.   

    谢了,思路可行,但是这样服务器的压力会不会太大了。我还是想要实现服务器端的主动推送..看来我还是去学校图书馆借本《DWR实战》来,仔细琢磨琢磨。
      

  6.   

    应该是这样的,我也是以正常的头脑猜测。以前很粗浅的用了dwr框架,没有深入了解。为了这个反推ajax,我决定要好好学习dwr了。曾经借了这本《DWR实战》,但是没空看,还给学校了,今天就去借回来,希望有...阿弥陀佛!
      

  7.   

    我不会DWR 整理下大脑 重新说次他的意思大概是:访问页面的时候假设出现了新的用户 新的用户将自己的标记发送给服务端 服务端将该用户标记保存到列表中 当有信息到来的时候 将信息发送给客户端(我不知道这步骤怎么做的 一个请求一直没有返回结果 直到有消息的时候才将返回结果并重新再请求一次?) 发送到客户端后 在客户端进行验证 判断这条信息是否属于当前用户 如果不是就不做任何操作
    乱了
      

  8.   

    你最核心的思想就是:一定要客户发送请求,服务器才回应一次。
    我的想法是:客户登陆,服务器端做标记。这次请求有回应啊,就是用户合法,进入了系统啊。然后,客户端不用去请求,服务器只要受到消息,就直接回应给客户端,并不需要客户端的请求。不知道DWR内部是如何实现,是不是一定要有客户端的请求呢,我也不解。
      

  9.   

    文摘:
    现在,有一个实施:反向Ajax实际上是个幻觉!但是,知识一个故意为之的幻觉,而不是无意义的幻觉。在当前HTTP技术的限制下。根本找不到真正的吧信息从服务器推送到客户端的方式,因为这个协议是无状态的,并且客户端发起的连接一旦断开,服务器就不可能了解客户端。不管到底哪一方发起这个连接,都不存在从客户端到服务器的“持续”连接。
    虽然没有真正的推送技术,但是可以完美的模拟它!
    有三种DWR支持的技术可以辅助完成这种技术.....
      

  10.   


    幻觉???既然它能封装出这种幻觉,你就研究下吧。到时候分享哦..上面我没把描述清楚吗?

    我的想法是:客户登陆,服务器端做标记。这次请求有回应啊,就是用户合法,进入了系统啊。然后,客户端不用去请求,服务器只要受到消息,就直接回应给客户端,并不需要客户端的请求。”既然是 main.jsp 是所有用户登录后的目的地。且不同用户登录后都是显示各自的信息..我们在用户登录时就在后台保存好每个用户ID对应的 session标识(sessionId)。这样 不管哪个用户有新消息,都可以通过userId查找到 最新登录时那个session。再反推至 main.jsp。在页面匹配sessionID 相同的话 就可提示了...
      

  11.   

    B/S和C/S是有差别的,不要用C/S的方式去想像B/S,除非你不用http协议,一个比较不错的方法,就是在Client端定时发送ajax请求,因为在B/S下,只能是客户端发起请求。原理明白了,实现就很简单了。
      

  12.   

    DWR好像是一秒发一次请求,然后服务器上一直等待.轮询,
    CSDN里的左上方消息提示好像是半分钟一次AJAX请求.
    你 的QUARTZ根本用不了.在这里
      

  13.   

    我觉得好像也是这个样子 只能B->S这样走反过来貌似不行的说
    觉得短消息那个功能应该都是服务器同步的结果 只不过每次刷新页面的时候都会去服务器端访问一次 看有没有新数据
      

  14.   

    DWR跟AJAX的原理是一样的,其实楼主说的反推就是COMET技术!DWR其实就是把简单说来就是AJAX技术的另一种表现(这个的话,你可以好好的阅读下DWR产生的JS文件)让客户端与服务器一直保持连接!如果是让客户端去每次请求刷新,服务器受不了,会容易发生宕机!反之如果让服务器去找断掉的客户端?那根本不可行!所以客户端与服务器一直保持连接,服务器才能找到客户端的请求,进行响应!
      

  15.   

    CSDN的消息提醒绝对不会是COMET ,这个局部的会用AJAX实现。COMET一般应用时间很短的交互,耗服务器性能!而且会在一段不短的时间内反复发送请求,如果过快就会像上次youku网的真正的“响应地球一小时”了!
      

  16.   

    我现在明白一点:就是服务器不会主动去和客户端通信。轮询是客户端或Ajax引擎每隔固定时间向服务器发起请求。DWR的comet和piggybacking技术都是要先有客户端的请求。但是我现有的一些例子只能发送到所有main.jsp。而不知道如何发送到指定的例如A用户的main.jsp!求解中......是在没办法还是用socket编程吧,在servlet中定义一个线程(一直开者),通过流的形式将信息输出到客户端,应该行吧,不过挑战很大啊 .....大家讨论下吧!
      

  17.   

    哎,我只是拿CSDN做个例子,实际情况是 日程,备忘的提示功能及系统中的消息发送。所以用Quartz。
      

  18.   

    通过AJAX  异步传输 机制 就可以了。A 发送 消息给 B, A 提交 了要发送的 “消息”  给服务器,和 以及 B的ID ,如果 B 在线,那么他的SessionID 肯定不为空, 这时候 服务器端就 可以通过B的ID,发送到 B客户端 ; 反之如果SessionID 不存在,则 保存到 DB中, B客户端登陆时 就可以查收到。
      

  19.   

    登录的时候会自动查找吗?
    ,还是要用ajax再次请求?