浅谈思路严谨的管理软件中的用户在线状态控制【附部分C#参考代码】

10.1放假了,希望大家都能度过平平安安快乐的国庆长期,希望写程序的光棍汉同行都能遇上桃花运,早日找到自己的另一半,也希望我刚满月的女儿能健健康康成长,长大了找个优秀的程序员嫁了,哈哈。

 

我们经常会遇到

1:客户购买了5个用户的许可,10个用户的许可,软件需要限制用户的并发数量,我知道就是Oracle的并发用户达到20个以上,那费用是非常昂贵的。

2:一个用户只能登录一次或者是一个账号在同一时间只能登录一个,若已经是登录了就不让再登录了,需要能控制用户的并发登录问题。

3:有的系统也需要能实现在线用户列表、用户的登录状态等,特别是即时消息功能的内部管理系统等。

 

先把自己的思路整理图贴出来如下:

浅谈思路严谨的管理软件中的用户在线状态控制【附部分C#参考代码】_第1张图片

 

C/S的部分参考代码如下:这里为了实现定时获取消息的平滑,利用了线程的方式,这样不影响用户的操作,是多线程实现定时获取消息的。

代码
         ///  
        
///  消息检测的线程
        
///  

         private  Thread MessageThread  =   null ;

            
this .MessageThread  =   new  Thread( new  ThreadStart( this .MessageCheck));
            MessageThread.Start();

                 
private   void  MessageCheck()
        {
            
while  ( ! this .ExitApplication)
            {
                
if  ( this .FormLoaded  &&  ( ! this .Busyness))
                {
                    
if  ( this .Tag  ==   null )
                    {
                        
//  获得新消息
                        
//  this.bwGetNewMessage.RunWorkerAsync();
                         this .GetNewMessage();
                        
this .Tag  =   true ;
                    }
                    
else
                    {
                        
//  若已经是最小化、或者被隐藏起来了,就不用获取在线状态,可以提高效率
                         if  (( this .WindowState  ==  FormWindowState.Minimized)  ||   ! ( this .Visible))
                        {
                            
//  阅读消息状态
                            
//  this.MessageChek();
                        }
                        
//  获取在线状态列表
                        
//  this.bwGetOnLineState.RunWorkerAsync();
                         this .GetOnLineState();
                        
this .Tag  =   null ;
                    }
                }                
                Thread.Sleep(
1000 );
            }
        }

 

B/S部分的参考代码如下:

UserOnLine.aspx 页面,专门接收,我还活着的用户的报道,统一呼叫这个页面,表示自己还活着,在线上。

用了javascript 的 setTimeout 功能,定时在服务器上用 ajax 方式进行签到,这样可以正确处理B/S系统的在线情况

代码
< script language = " javascript " >
    function ReloadSession() {

        XmlPost(
" Modules/Common/User/UserOnLine.aspx " );
        
//  每100秒钟刷新一次
        
//  alert("ReloadSession");
        setTimeout( " ReloadSession() " 1000   *   100 );
    }

    ReloadSession();
script >

 

 

以上只是一个非高科技的,用最传统的方法,最说得通的方式,正确解决在线用户的状态,其中解决了B/S,C/S通用的在线方式问题,突然断电等异常情况下的事务处理在线判断,服务器上,还可以部署在线状态跟踪器等,100%完全正确做到在线状态,还是有点儿小困难,特别是B/S的项目,目前的能力,只能做到近似效果,当然根据实际需要,也可以修改向服务器报道我活着的频率,例如5秒报道一次,那就更接近真实在线情况了,当然在线客户数量很少时,1秒一次也无所谓的。

 

将权限管理、工作流管理做到我能力的极致,一个人只能做好那么很少的几件事情。

posted on 2010-09-30 19:12 吉日嘎拉 不仅权通用权限 阅读(1719) 评论(22) 编辑 收藏

评论

#1楼   回复  引用  查看     低效了,不好
2010-09-30 19:20 | 亚历山大同志       

#2楼  回复 引用 查看   

等我吃了饭回来写高效的办法
2010-09-30 19:21 | 亚历山大同志       

#3楼  回复 引用 查看   

第二条改成 如果重复登录,后登录的会把先登录的踢下线,这样实现起来要简单得多
2010-09-30 19:22 | 亚历山大同志       

#4楼  回复 引用 查看   

我的解法方法是用一个在线表解决,大概思路如下
1, 用户登录,退出时,加入或删除在线表中自己的数据,同时判断在线表中其它用户是否掉线(如果长时间段不操作,根据lasttime,来踢出超时者)
2,用户操作,在一个程序的设定时间范围内操作,会去检查在线表(踢出掉线用户)
2010-09-30 20:16 | zjy       

#5楼  回复 引用 查看   

菜鸟路过
2010-09-30 20:33 | qzdotnet       

#6楼  回复 引用 查看   

有个疑问,oracle的并发数量,应该是指链接数据库的connection的并发把?

如果我开了连接池,那么理论上就可以控制了吧?、
2010-09-30 20:40 |        

#7楼  回复 引用 查看   

就凭这句
引用10.1放假了,希望大家都能度过平平安安快乐的国庆长期,希望写程序的光棍汉同行都能遇上桃花运,早日找到自己的另一半,也希望我刚满月的女儿能健健康康成长,长大了找个优秀的程序员嫁了,哈哈。

我顶了。

2010-09-30 21:01 | 湖南人       

#8楼  回复 引用 查看   

支持一下
2010-09-30 21:35 | 伍华聪       

#9楼  回复 引用 查看   

请你的截图是用什么工具搞的,灰常漂亮
2010-09-30 23:45 | Jeremy Ding       

#10楼  回复 引用 查看   

引用Jeremy Ding:请你的截图是用什么工具搞的,灰常漂亮
嗯,同问。
2010-10-01 01:02 | 南通SEO       

#11楼[楼主]  回复 引用 查看   

office 2007 插入,设置格式做出来的,很简单的

引用南通SEO:
引用Jeremy Ding:请你的截图是用什么工具搞的,灰常漂亮
嗯,同问。
2010-10-01 01:17 | 吉日嘎拉 不仅权限管理       

#12楼  回复 引用 查看   

引用辰:
有个疑问,oracle的并发数量,应该是指链接数据库的connection的并发把?

如果我开了连接池,那么理论上就可以控制了吧?、

自从有了3层物理架构,软件商就改了授权,按最终设备算用户了,不管你应用服务器使用连接池是几个连接,最终设备通过应用服务器间接连到数据库,要算一个LIC,至少微软是这样的
2010-10-01 02:00 | James-yu       

#13楼  回复 引用 查看   

引用伍华聪:支持一下
2010-10-01 05:26 | Tony Zhou       

#14楼  回复 引用 查看   

目前正需要这样的功能。这个方法的效率一般呀,楼主发你的更好方法出来吧。先支持一下。
2010-10-01 13:48 | 冷冷的風       

#15楼  回复 引用 查看   

为楼主的精神鼓掌,我在国庆节在静候我家宝宝的降临~
2010-10-01 18:54 | 五子登科       

#16楼[楼主]  回复 引用 查看   

那你觉得什么样的会更好呢?
引用冷冷的風:目前正需要这样的功能。这个方法的效率一般呀,楼主发你的更好方法出来吧。先支持一下。
2010-10-01 18:54 | 吉日嘎拉 不仅权限管理       

#17楼[楼主]  回复 引用 查看   

就这几天要诞生吗?祝贺你马上快要升级了。

引用五子登科:为楼主的精神鼓掌,我在国庆节在静候我家宝宝的降临~
2010-10-01 19:04 | 吉日嘎拉 不仅权限管理       

#18楼  回复 引用 查看   

按sessionid作为键的hash表与时间有序的引用链表
2010-10-02 14:20 | 钧梓昊逑       

#19楼[楼主]  回复 引用 查看   

@钧梓昊逑
sessionid 的过期怎么处理?能有相对及时性的效果出来不。
2010-10-02 17:46 | 吉日嘎拉 不仅权限管理       

#20楼  回复 引用 查看   

我说的是用来解决效率的,而不是处理超时与断线的
如果WEB上要即时处理断线的情况,需要用长连接
2010-10-02 23:20 | 钧梓昊逑       

#21楼  回复 引用   

引用吉日嘎拉 不仅权限管理:
@钧梓昊逑
sessionid 的过期怎么处理?能有相对及时性的效果出来不。
先研究一下什么情况下session会过期,会引发什么事件,再来讨论怎么处理吧.
2010-10-03 21:44 | fireinwind[未注册用户]

#22楼  回复 引用   

可以在内存中存储一个Hash来唯一登陆

Hashtable("loginName","hash value");

hash的值也可以是guid值,保证绝唯一

当有用户操作,或是我们客户端setTimeout时,比较我们本地的Cookie值的 hash值

如果是一致的,继续操作,如果不一致,强制登出.

你可能感兴趣的:(c#,2010,应用服务器,javascript,oracle,数据库)