即时消息机制实现方法

 
即时消息机制实现方法
 
一般的信息处理系统中都存在网站内,系统内的人员互相发消息的要求,而实现起来一般也都补复杂,无非是数据库中建立1张表用来记录具体的消息内容和状态,发送者,当然这里也可以分解成2张表,都无所谓,只要能处理好就可以了.
 
主要是解决对于发送的消息的及时收到的消息,对每一个登录的客户端都需要定时来请求,来获得有没有自己的消息,这个定时触发的时间一般在几秒中之内,超过1分钟即不算即时消息了.如何解决这种客户端频繁请求消息的过程,如果这样大频率的直接请求查询数据库,必将在客户人数增加后导致服务器的崩溃.
 
可以采用内存映射的机制来处理.
设计一个内存共享的的 HashMap可以把它放在一个单态类中,用来映射消息.可以简单实现如下:
Key(userId)
Value(消息个数)
201
2
202
0
203
1
……..
……
1.       在用户登录的时候,首先根据用户的id查询数据库,统计消息的个数,并put到HashMap中.
2.       在客户端首页的某个位置来间隔一定的时间来请求检验该HashMap,如果消息个数不为0,则进行新消息的提示.
3.       在发送消息的时候,在给每一个接收者在HashMap中的消息个数++.
4.       在消息接受者查看消息时,给每一查看者的HaspMap对应的消息个数--.
5.        
关于页面定时提交, 可以采用javascript 的方法设定定时, 并结合ajax 异步提交机制来进行定时请求, 如果发现计数器不为零, 则进行更改动画的消息图片来提示.
 
附录:
Message.js文件:
var send_space;
var time_space=5000;//5
var i=0;
var basePath="";
var objimg;
    function messagecheck(objname,path){
     basePath=path;
     objimg=document.getElementById(objname);
     send();
    }
    function send(){
    send_space=setTimeout("send();",time_space);
    i++;
    lock_requestdel();
    }
 
    function lock_requestdel() {// 初始化、指定处理函数、发送请求的函数
        http_request = false;
        var url=basePath+'messagesendcheck';
        // 开始初始化XMLHttpRequest对象
        if(window.XMLHttpRequest) { //Mozilla 浏览器
            http_request = new XMLHttpRequest();
            if (http_request.overrideMimeType) {// 设置MiME类别
                http_request.overrideMimeType('text/xml');
            }
        }
        else if (window.ActiveXObject) { // IE 浏览器
            try {
                http_request = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {
                try {
                    http_request = new ActiveXObject("Microsoft.XMLHTTP");
                } catch (e) {}
            }
        }
        if (!http_request) { // 异常,创建对象实例失败
            window.alert(" 不能创建XMLHttpRequest对象实例.");
            return false;
        }
        http_request.onreadystatechange = processRequest_del;
        // 确定发送请求的方式和URL以及是否同步执行下段代码
        http_request.open("POST",url, true);
        http_request.send(null);
 
    }
    // 处理返回信息的函数
 
    function processRequest_del()
     {
        if (http_request.readyState == 4)
         { // 判断对象状态
         // popinfo(1);
            if (http_request.status == 200)
             { // 信息已经成功返回,开始处理信息
                 if((http_request.responseText)!=null&&(http_request.responseText).indexOf("false")>=0){       
                    // alert(" 删除失败");    
                     objimg.innerHTML=" ";
                  }
                  else if((http_request.responseText)!=null&&(http_request.responseText).indexOf("true")>=0){
                  ///
                      var url="'"+basePath+"progress/message.do?method=list'";
                      var mm="'main'";
                      var src='<img src="'+basePath+'style/temp1/images/sms1.gif" οnclick="window.open('+url+','+mm+')"   title=" 新消息" style="cursor:hand" />';
                    objimg.innerHTML=src ;
                  }
             }
            else
             { // 页面不正常
              // alert(" 服务器错误!!");
              objimg.innerHTML=" ";
             }
        }
     }
 
提示页面:
<span id="message"></span>
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值