请教各位大哥如何在C#(Winform)下实现像QQ一样只准同时让一个用户登陆一个帐号?
并且能够判断再用户非正常断线如何在一定时间内清除这个用户让他下次还能登陆?我想应该是在客户端和服务器端有侦听的程序,具体改如何做呢?
谢谢!

解决方案 »

  1.   

    程序应该如何写呢?
    ================================================================
    此帖通过csdn小助手回复。
        CSDN小助手是使用vb.net编写的CSDN论坛脱机“外挂”,她能够在
    脱离IE的情况下使用Csdn论坛。程序只加载最核心的数据,所以显示更
    快,产生的流量更小。    下载地址:http://qqwwee.com/csdn.rar
    ================================================================
      

  2.   

    楼上的大哥,你这样不能解决非正常掉线的情况,
    ================================================================
    此帖通过csdn小助手回复。
        CSDN小助手是使用vb.net编写的CSDN论坛脱机“外挂”,她能够在
    脱离IE的情况下使用Csdn论坛。程序只加载最核心的数据,所以显示更
    快,产生的流量更小。    下载地址:http://qqwwee.com/csdn.rar
    ================================================================
      

  3.   

    需要用Socket吗?
    ================================================================
    此帖通过csdn小助手回复。
        CSDN小助手是使用vb.net编写的CSDN论坛脱机“外挂”,她能够在
    脱离IE的情况下使用Csdn论坛。程序只加载最核心的数据,所以显示更
    快,产生的流量更小。    下载地址:http://qqwwee.com/csdn.rar
    ================================================================
      

  4.   

    客户端每隔一段时间就轮询一次服务器.QQ使用UDP协议.如果有返回就保持在线状态,没有返回就是离线状态
      

  5.   

    嗯,应该是每隔一段时间就查询一次.有时候QQ非常断线时,你还是可以看到对方的QQ显示在线的状态.
      

  6.   

    要把长颈鹿装冰箱,总共分四步:一、建一个用户登陆数据库:
    Logined(UserName(String),LastLoginTime(DateTime),LastLoginIP(String)),
    表名 字段名 字段类型 写一块了我,应该好理解的吧。用户每次登陆的时候,先验证帐号密码,如果验证成功,则检查Logined库:
    If 此帐号存在库中 Then
       If 上次登陆IP与本次相同 Then 
          允许登陆
       ElseIf 上次登陆时间距离现在N久 Then 
          允许登陆
       Else
          提示:此用户已登陆
       End If
    Else
       允许登陆
    End If
    (C#怎么写,你自己研究吧。)二、每次登陆以后,删除超时无动作的用户,就是说,可能有用户登陆以后非正常断线,但他保存在库里的信息却还在,所以,我们要及时清理这些无用信息。
    DELETE FROM Logined WHERE LastLoginTime > N三、用户登陆后,每次动作,都要检查Logined库和更新Logined库。
    SELECT * FROM Logined WHERE UserName = 当前用户
    如果没找到,则提示用户超时,请重新登陆。
    如果找到,先判断用户登陆是否超时以及上次登陆的IP是否与当前IP相同。
    如果这些验证都通过,则更新LastLoginTime为当前时间。
     UPDATE Logined SET LastLoginTime = 当前时间 WHERE UserName = 当前用户
    否则提示用户重新登陆。四、考虑到宽带用户使用动态IP,如果宽带用户当机,则在一定时间内无法登陆。我们可写一个让用户强行下线的程序。就是通过提交用户的用户名和密码,删除该用户在Logined库中的记录。以便使该用户能够正常登陆。
      

  7.   

    听几位大哥说得,应该不用Socket,直接利用数据库操作就可以了吧?
    ================================================================
    此帖通过csdn小助手回复。
        CSDN小助手是使用vb.net编写的CSDN论坛脱机“外挂”,她能够在
    脱离IE的情况下使用Csdn论坛。程序只加载最核心的数据,所以显示更
    快,产生的流量更小。    下载地址:http://qqwwee.com/csdn.rar
    ================================================================
      

  8.   

    谢谢大哥,我还想问一下,在不同的路由后面有相同的IP用相同的用户名登录的时候按照您这种方法理论上是可以让他们同时登录在线的,这与我原先的要求:一个用户同一时间只有一个在线有矛盾如何解决?谢谢!
    ================================================================
    此帖通过csdn小助手回复。
        CSDN小助手是使用vb.net编写的CSDN论坛脱机“外挂”,她能够在
    脱离IE的情况下使用Csdn论坛。程序只加载最核心的数据,所以显示更
    快,产生的流量更小。    下载地址:http://qqwwee.com/csdn.rar
    ================================================================
      

  9.   

    如果楼主的程序在两个用户同时登录的情况下不会引起什么灾难性的危险(比如会破坏数据库的完整性),那就没太大问题,毕竟Submarines兄的方法在理论上虽然存在你说的漏洞,但实际上出现的机会会非常小,而且在使用者也不知道你使用这种机制的情况下,应该不太可能会利用这个漏洞攻击你的数据库。但漏洞毕竟是有的,如果能取到前端路由的IP加上本机的IP一起判断就应该很完美了
    ================================================================
    此帖通过csdn小助手回复。
        CSDN小助手是使用vb.net编写的CSDN论坛脱机“外挂”,她能够在
    脱离IE的情况下使用Csdn论坛。程序只加载最核心的数据,所以显示更
    快,产生的流量更小。    下载地址:http://qqwwee.com/csdn.rar
    ================================================================
      

  10.   

    不同的路由后面有相同的IP。
    这不可能!我可以打包票!具体为什么不可能,你可以询问一下当地ISP服务提供商。
    比如说网通电信什么什么的。
    他们可以向你保证不会出现有相同的IP。
      

  11.   

    我现在取的IP是用户本机的IP(如192.168.1.2)而没有取前端路由在互联网上的IP(202.xxx.xxx.48)假如A用户已这种配置使用用户帐号"123"登录,而用户B在
    另一路由IP(202.xxx.xxx.47)后使用其本机IP(192.168.1.2)和用户帐号"123"登录
    程序判断的IP都是用户本机子的IP(192.168.1.2),既可以通过您说的验证方法使她们
    同时登录在线,如果用前端路由IP进行判断那么在同一个路由后面都可以用同一个
    用户名登录
    您所说的IP分配不同指的是前端路由IP,并不能保证不同路由用户IP不重复(许多网吧
    都使用这种方法配置)!================================================================
    此帖通过csdn小助手回复。
        CSDN小助手是使用vb.net编写的CSDN论坛脱机“外挂”,她能够在
    脱离IE的情况下使用Csdn论坛。程序只加载最核心的数据,所以显示更
    快,产生的流量更小。    下载地址:http://qqwwee.com/csdn.rar
    ================================================================
      

  12.   

    顺便说一句,如果你还是不放心。
    就把取IP地址,改成取本机Mac地址。
      

  13.   

    大哥: ElseIf 上次登陆时间距离现在N久 Then 
    这句话的N怎么取,难道要取很大?
      

  14.   

    再问下大哥
    ”用户登陆后,每次动作“是什么意思?
    ================================================================
    此帖通过csdn小助手回复。
        CSDN小助手是使用vb.net编写的CSDN论坛脱机“外挂”,她能够在
    脱离IE的情况下使用Csdn论坛。程序只加载最核心的数据,所以显示更
    快,产生的流量更小。    下载地址:http://qqwwee.com/csdn.rar
    ================================================================
      

  15.   

    如果你想要像QQ那样有挂机功能的话。
    就让程序能够定时M(M < N)自动发送一个更新LastLoginTime的指令,同时计算累计时间长就可以了。
    把数据库里加一个累计时长的字段,TotalTime(Long).
    UPDATE Logined SET LastLoginTime = 当前时间, TotalTime = TotalTime + M WHERE UserName = 当前用户如果只是普通的OA系统,就不用费这个事了。谢谢。 我是新来的, 这地方 挺好!