Indy TIdTCPServer和断开连接

时间:2012-12-13 09:47:56

标签: delphi indy disconnection

我有一个小问题(我希望它很小)与断开服务器 - 我的意思是 - 只是在我想要断开它与服务器应用程序(server.active = false)的那一刻。 这是我的简单代码:

    type
      PClient = ^TClient;
    type
      TClient = record
        Name: string;
        AContext: TIdContext;
    end;


     clients: TThreadList;
     SERVER: TIdTCPServer; 

    procedure TX.SERVERConnect(AContext: TIdContext);
    var
      NewClient: PClient;
      s:string;
    begin
        s := AContext.Connection.socket.ReadLn();
        GetMem(NewClient, SizeOf(TClient));
        NewClient.name:=s;
        NewClient.AContext := AContext;
        AContext.data := TObject(NewClient);
        try
          clients.LockList.Add(NewClient);
        finally
          clients.UnlockList;
        end;
        AContext.Connection.socket.writeln('E:');//answer to client - "all right"
    End;


    procedure TX.SERVERDisconnect(AContext: TIdContext);
    var
      AClient: PClient;
    begin
      AClient := PClient(AContext.data);
      try
        clients.LockList.Remove(AClient);
      finally
        clients.UnlockList;
      end;
      FreeMem(AClient);
      AContext.data := nil;
    end;

它必须仅用于向客户端发送数据,因此我在onconnect过程中只读取一个数据行 - 它包含登录名。

在我的代码中发送数据的过程看起来像(好吗?):

    var
    procedure TX.send(what: string; where: string);
      i, ile: integer;
      s: string;
      Aclient: PClient;
      list: tlist;
    begin
      list:= SERVER.Contexts.LockList;
      try
        for i := 0 to list.Count - 1 do
          with TIdContext(list[i]) do
          begin
            AClient := PClient(data);
            if where = ActClient^.name then
              Connection.IOHandler.writeln(what);
          end;
      finally
        SERVER.Contexts.UnlockList;
      end;
    end;

看起来效果很好 - 我的意思是。但是当我想通过SERVER.active来禁用服务器时:= false应用程序会冻结吗?我试图释放客户等等,但它不适用于我的错误代码。

有人可以帮助我并告诉我如何为此代码停止服务器吗?

ARTIK

0 个答案:

没有答案