Remoting怎么知道哪些客户端连到了服务器?怎么踢客户端?好像 Remoting中没有事件,所以在服务器端不知道怎么获取并控制客户端。

解决方案 »

  1.   

    这个可以使用心跳包算法。
    定义心跳包包括客户端的ID,
    然后通过在服务器端接收到客户端的心跳包中来统计在线客户。、
    具体实现:SOCKET编程+多线程。
      

  2.   

    难道你的Remoting不需要登陆认证吗?
    不能获取客户端IP吗?
    private string GetIpAddress()
    {   
     IPHostEntry ipHE = Dns.GetHostByName(Dns.GetHostName());
     return ipHE.AddressList[0].ToString();   
    }
      

  3.   

    Remoting要登陆认证呀?我现在用的是直接连,到时在调用方法执行 sql语句来验证用户的合法性。
    当然在验证用户合法性的时候,sql的连接已经通了。以前 C/S 结构是在 数据库中判断有多少人在线,Delphi可以在 RemoteDataModel中加计数值或更详细的信息(如IP地址、NT用户名、登录时间、系统账号),有了这些信息,足以踢人。
      

  4.   

    真是麻烦,
    干脆每次调用远程方法的时候 都把 用户信息(用户名、密码、IP、进程ID、...、调用时间) 之类的东东都添加到 sqlserver的一个固定表中,如果表里边有该 用户名+进程ID 就仅修改其调用时间。
    当用户退出系统时,再删掉sqlserver中那笔记录。
    当客户端意外退出系统,到时需要手工删掉那笔异常的记录。也就是说按照C/S结构的方法,把信息存到sqlserver中,不放到 中间层。
    这样就可以限制用户的个数了。
      

  5.   

    如果你要通知客户端它“被踢了一脚”,那么你单独设计一个通知机制。remoting可以实现事件(但是要单独设计中间的过渡机制,自己搜索一下)。不过它根本不能跨NAT网关路由器,所以也不太实用。顺便说一下,我认为Remoting非常老旧过时了,那个时候各大公司都争相推出复杂的网络对象机制比谁更能忽悠。而现在甚至xml都老旧了,现在是json、REST之类的时代,所以使用tcp或者http,基于简单的通讯方式即可,甚至越是简单的通讯越能方便地实现跨越NAT的服务器向客户端推送消息的任务。
      

  6.   


    我没有仔细看你的逻辑。在你的服务器端,既然要读取数据库,那么就可以放在内存中。比如说你的内存中可以有一个简单的 Dictionary<long, YourUserType> 类型的字典,其key是你分配给每一个客户端登录时的一个会话编号,那么客户端访问服务器的时候拿它自己的会话编号来访问就行了,无需重复验证帐号密码。而踢掉它,也不过就是在这个字典中Remove相应的编号即可。
      

  7.   

    Remoting是很老旧了,但我一个人连摸带爬的,每一次的技术革新对我来讲都是非常昂贵的。
    我的 Remoting也很简单,就是 传字符串参数、传序列化的DataTable对象,就是走tcp或http协议。垃圾回收机制还没搞明白,在服务器端建个 Dictionary<>,谁知道哪时会被 神不知鬼不觉 地收掉。
      

  8.   

    我去问以前的同事,
    1. 他们还在用 vs2005,用的是remoting
    2. 由于他们的客户比较可靠,无需考滤的 加密、摸糊、强名称 之类的 代码保护、安全保护。
    唯一比我用得新的就是sql2005,我还停留在sql2000,因为我要考滤发布时方便。
    所以问他们也问不到什么。