如题。

解决方案 »

  1.   

    自己去indy的主页下载demo看看
      

  2.   

    这个Data其实就是代表连接对方的东西,比如一个文件服务器,对话开始后,设定一个初始目录,然后接受客户的命令,客户发送cd xxx时,服务器必须记住客户在对话期间的当前目录,所以要持有一个对象或者数据结构来记录这些信息,tpeer = class
      ip: string;
      currDir: string;
    end;tserver = class
    private
      fTCPServ: TIdTCPServer;
      fClients: TThreadList;
    procedure
      procedure onConnect(aThread: TIdPeerThread);
      procedure OnDisconnect(aThread: TIdPeerThread)
      procedure OnCDCommand(aSender: TIdCommand);
    ...procedure TServer.OnConnect(aThread: TIdPeerThread);
    var
      client: tpeer;
    begin
      //当连接开始时,创建客户对象
      
      client := tpeer.create();
      client.ip := ...;
      client.cd := default_directory;  ...
      aThread.Data := client;  //如果有必要,记录将这个对象添加到当前活动对话当中
      //那么, fclientList则反映了当前活动的连接,以及各个连接的相关信息
      fClients.LockList();
      try
        fClients.add(client);
      finally
        fClients.unlocklist();
      end;
    end;procedure TServer.OnCDCommand(aSender: TIdCommand);
    var
      client: tpeer;
      targetDir: string;
    begin
      //处理CD命令  //取得持有的peer对象
      client := tpeer(aSender.thread.data);
      
      targetDir := MyParseParam(aSender.Params);  //执行cd命令,并更新current directory
      client.currDir := ChangeDir(client.currDir + targetDir);  MyReplyOk(aSender);
    end;procedure TServer.OnDisconnect(aThread: TIdPeerThread);
    begin
      //如果先前纪录了peer,现在要把它从列表中去掉
      fClients.LockList();
      try
        fClients.remove(aThread.Data);
      finally
        fClients.Unlocklist();
      end;
      //连接断开了,这个时候要释放先前创建的peer对象
      tpeer(aThread.Data).Free();
      aThread.Data := nil;
    end;简单的用法就是这样