最近开发了一个用Delphi自带的
Socket做代理服务器的三层结构程序,
现在想控制客户端访问的用户数,
想请教各位有什么办法没有?

解决方案 »

  1.   

    To Erice:
    能详细说明下么,应用层怎么判断连接数,还有怎么杀死这个客户端连接时创建的应用层的线程。
      

  2.   

    这东西不复杂,修改ScktSrvr的源代码,把里面的一段procedure TSocketDispatcher.GetThread(Sender: TObject;
      ClientSocket: TServerClientWinSocket;
      var SocketThread: TServerClientThread);
    begin
      if Self.Socket.ActiveConnections <= 100 then  // 增加这句,100表示连接上限
        SocketThread := TSocketDispatcherThread.Create(False, ClientSocket,
          InterceptGUID, Timeout, SocketForm.RegisteredAction.Checked, SocketForm.AllowXML.Checked);
    end;
      

  3.   

    在ScktComp的TServerWinSocket.Accept 中加入  
    if Self.ActiveConnections <= 10 then 
    begin
    ...
    end;
    的限制。
      

  4.   

    To: pazee(耙子)(灵感点亮生活)
    谢谢你的指点,我试了一下,你的方法可以控制连接数。
    但是当超过连接数的时候,客户端却不停的去连接而又连接不上,
    给客户看起来好象是系统Down机的感觉。
    能不能在客户连接的时候,给客户端'连接数已满'等提示
      

  5.   

    在应用层写入:
    function TServer.login(const client_no: WideString;): OleVariant;
    var
      flag:integer;
    begin 
      flag:=2;//
      if clientnumber>=100 then
      begin
        flag:=1;
        self.Destroy;
      end;
      result:=flag;
    end;客户端就调用应用层的程序,根据返回状态来启动或关闭程序
      

  6.   

    在ScktComp的TServerWinSocket.Accept 中加入  
    if Self.ActiveConnections <= 10 then 
    begin
    ...
    end
    else
    begin
      ShowMessage('连接数已满');
    end;
    的限制。
      

  7.   

    当然上面的ShowMessage('连接数已满');
    只是一个代表,在ScktComp中,你还可以找到ClientSocket在相应的Connect中加入条件限制即可。
      

  8.   

    pazee(耙子)(灵感点亮生活) 对啊
    应该需要服务器端客户端配合才行。--------------------
    应该让和客户端约定收到什么数据表示什么意思
    服务器端达到最大连接后给客户端发送特定的数据
      

  9.   

    pazee(耙子)(灵感点亮生活)用点脑筋想好不好!如果搂主的程序服务器和客户端配合是能解决限制搂主客户端的连接数,但不能达到真正限制连接数的初衷,若你再编写一个客户端一样可以连接上搂主的服务器。
    应当在服务器端加以限制,客户端不可以作指望的。当服务器端拒绝连接时,客户端只能弹出不能连接服务器的对话框,现在大多数应用都是这么做的。
      

  10.   

    不是恼,只是人敬我三分我敬人七分!还是拜托你,仔细想想好不好!连接和分配服务器线程是有区别的,你的方法只能拒绝分配线程,客户端已经连接上了!这样很可能导致系统不能提供任何服务!要满足搂主要求要在Winsock那一层解决!
      

  11.   

    要是你们能仔细看看,就明白了。
    这就是在应用层断开客户端的请求连接的在应用层写入:
    function TServer.login(const client_no: WideString;): OleVariant;
    var
      flag:integer;
    begin 
      flag:=2;//
      if clientnumber>=100 then
      begin
        flag:=1;
        self.Destroy;
      end;
      result:=flag;
    end;客户端就调用应用层的程序,根据返回状态来启动或关闭程序
      

  12.   

    在CORBA中楼上的的确可行,但在Socket中您的服务器方法需要客户端连接服务器后,主动地断开连接,当另有人使用他自己的客户端连接时,在没有身份验证的情况下可以任意连接服务器,在有安全策略的情况下,当客户端不释放连接会使服务器造成DOS攻击式的拒绝服务,不满足搂主的初衷。
    只能在Winsock那一层加以限制,当客户端发出连接请求时,拒绝连接。
    当客户端想了解连接状态时,可以改写onSocketEvent,当为seLookup时无法连接,是无法连接服务器,当为seConnecting时无法连接,是服务器因为某原因积极地拒绝。
    我的ShowMessage('连接数已满');只是一个象征意义的语句,并不是说就是弹出对话框,只需填入服务器相应代码即可。
      

  13.   

    谢谢大家的帮助
    不过我有一点不明白的是
    到底是在代理服务器上控制还是在中间层应用服务器上控制好
    我觉得如果能在自己写的中间层上控制可能会好点。
    但是我不知道在中间层上怎样才能做到像Scktsrvr代理中
    显示连接的客户数,如果能做到我就能在客户端连接中间层时
    根据中间层的客户联接数返回一个值回客户端,根据这个值我就可以
    决定是否让客户端连接进来了
      

  14.   

    当然是在中间层上控制,搂主可能不知道我所说的ScktComp单元在哪,起什么作用,如下:
    你的SocketConnection需要引用SConnect 而SConnect又引用ScktComp,在Accept中修改代码即可达到搂主的目的。
      

  15.   

    DELPHI中的例子中,有一个程序,
      

  16.   

    http://community.csdn.net/Expert/topic/3195/3195626.xml?temp=.3226892