关于WEBQQ的实现(一)

  前段时间因为系统的需要,非得要加个消息提醒的通讯的功能。本来最最初是准备用C/S的方式实现的,但考虑到要做客户端,以后维护是一件相当麻烦的事情。对其程序进行任何修改都将要更新每一台机器的程序,而且程序运行还要安装FRAMWORK,以后升级维护都觉得有很多隐患。经过考虑觉得因该和现有系统结合(现有系统是。NET开发的B/S结构),于是萌发了做一个WEBQQ的想法。以前好象在网上有看过一个叫快狗的东西,我觉得别人既然能做我因该也可以做一个类似功能的东西吧。在网上找了一个控件用来做类似QQ的界面,其实可以用树型结构来做的,只是为了看的眩一点,呵呵。
  程序实现以下几个基本功能
1、可以显示在线人员,并既时的反映人员的在线情况,上下线比较迅速的反映出来。
2、可以在不同分组里选择人员发送信息
3、可以消息群发
4、发送的消息要既时的让对放收到。
刚开始做的时候认为功能不对,因该很容易实现,但是实际做的时候才发现在WEB上实现类似功能没有想的那么简单。
  首先是人员在线问题,我的想法是弄一个在线人员表来记录在线人员情况,当有人上线的时候时候就插入信息,下线的时候就删除信息。分组信息(既部门信息)以及人员信息都从现有系统的的表里读取,取取的时候取在线人员表,如果该人在显线则代表人员的图片为亮色,并把顺序提前,否则则为灰色。如下图:
online.jpg

遇到的一个问题是如何既时的获取人员的在线情况,我的方法是用JAVASCRIPT里面的setInterval方法来动态的加载一个JS文件,JS文件是由程页面生成的,他用来判断用户登录时的在线人员表是否和数据库里目前的表内容一致,如果不一致则当前也面重新加载。
 1 None.gif      < script language = javascript >
 2 None.gif <!--
 3 None.gif function  cc()
 4 None.gif{
 5 None.gifdocument.all.check.src = " checkout2.aspx " ;
 6 None.gif
 7 None.gif}
 8 None.gifsetInterval( " cc() " , 5000 );
 9 None.gif
10 None.gif // -->
11 None.gif </ script >
这样可以在不刷新页面的情况下动态取得人远在线情况
CHECKOUT2。ASPX中判断是否重新加载页面
 1 None.gif DataTable dtt = (DataTable)Session[ " online " ];
 2 None.gif                 if  (dt.Rows.Count == dtt.Rows.Count) 
 3 ExpandedBlockStart.gifContractedBlock.gif                 dot.gif {
 4InBlock.gif                    foreach(DataRow r in dt.Rows)
 5ExpandedSubBlockStart.gifContractedSubBlock.gif                    dot.gif{
 6InBlock.gif                        if(dtt.Select("userid="+r["userid"].ToString()).Length<1)
 7ExpandedSubBlockStart.gifContractedSubBlock.gif                        dot.gif{
 8InBlock.gif                       //Response.Write("<script language=javascript></script>");
 9InBlock.gif                            Response.Write("parent.main.location.href='qqmain.aspx';");
10InBlock.gif                        Session["online"]=dt;
11InBlock.gif                            return;
12ExpandedSubBlockEnd.gif                        }

13ExpandedSubBlockEnd.gif                    }
    上面完成了人员上线的问题解决方法,下线比较好解决,也是用JAVASCRIPT,在页面的onunload事件中掉用如下方法
 1 None.gif < script language = " javascript " >
 2 None.gif <!--
 3 None.gif
 4 None.gif function  logout()
 5 None.gif{
 6 None.gif
 7 None.gif
 8 None.gif     var  xmlhttp  =   new  ActiveXObject( " MSXML2.XMLHTTP " );
 9 None.gif    xmlhttp.open( " post " " out.aspx " false );
10 None.gif    xmlhttp.send( "" );
11 None.gif    
12 None.gif
13 None.gif}
14 None.gif // -->
15 None.gif      </ script >
该方法是为了在后台调用OUT。ASPX页面,该页面的功能就是将当前用户从在先表中删除
1 None.gif string  sql = " delete from user_online where userid=' " + this ._UserID + " ' " ;
2 None.gif            Data.EditData(sql);
以上就完成了一个WEBQQ基本的上下线功能,哎觉得写文字没有写程序通顺,希望大家能理解我的思路。上面方法其实存在一个问题,就是当用户非法退出的时候删除在线信息的功能可能无发执行(比如浏览器非法操作了),目前的解决方法是在一天中的某个时间段删除一次在线人员表,程序发现当前的在线信息和数据库的信息不一致的时候会自动重新加载一次页面,相当于更新了一次在线人员信息。反正以上方法思路可以保证80%以上有效,如果大家有更好的建议和方法可以告诉我一起交流一下。文字写的不好,多多见谅。下次谈谈如何搞定消息的即时发送和接收的问题。

转载于:https://www.cnblogs.com/DarkAngel/archive/2005/07/09/189133.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值