这个问题困扰我好久了,客户端未连接时不报错,一旦客户端连接后退出就报错!看过网上的一些贴子,好像不起作用!
为了更好说明,我将IdTCPServer的事件代码贴在下面,望各位高手提供解决方法,分不够可以再加!先谢谢了!!
procedure Tmainf.IdTCPServer1Execute(AThread: TIdPeerThread);
var
  //
begin
  AThread.Connection.ReadBuffer(ctext, sizeof(ctext));
  case ctext.command of
    Clogin: //登陆
      begin .. end;
    Creg:  //注册
      begin .. end
    ..
end
procedure Tmainf.IdTCPServer1Exception(AThread: TIdPeerThread;
  AException: Exception);
begin
  if AThread.Connection.Connected then AThread.Connection.Disconnect;
end;procedure Tmainf.IdTCPServer1Disconnect(AThread: TIdPeerThread);
begin
  mainctrl.deleonline(AThread);//删除在线用户
  DisConn(AThread); //用于处理客户端退出,以及往界面上的memo中加日志
  //这二个过程不执行也同样报错!
end;

解决方案 »

  1.   

    procedure Tmainf.IdTCPServer1Exception(AThread: TIdPeerThread;
      AException: Exception);
    begin
      if AThread.Connection.Connected then AThread.Connection.Disconnect;
    end;你把这个事件中的代码去掉 不要执行这个事件 看看可以不可以~~~
      

  2.   

    TO:zuoansuifeng
    谢谢你的建议!  
    你说的方法不管用,去掉这个事件还是同样的报错!
      

  3.   

    你的IdTcpServer是什么版本的。
      

  4.   

    晕倒,什么叫客户端连接后退出出错?你下面的代码是连接登录上了就又断开了,那你退出又是怎么写的
    procedure Tmainf.IdTCPServer1Exception(AThread: TIdPeerThread;
      AException: Exception);
    begin
      if AThread.Connection.Connected then AThread.Connection.Disconnect;
    end;
      

  5.   

    看了一下,估计你的问题出在cText.
    Ctext的数据类型是枚举?记录?还是...
    你可以这样测试一下:
    AThread.Connection.ReadBuffer(ctext, sizeof(ctext));改为...
    var
      cText: string;
    begin
      ctext := AThread.Connection.ReadLn;
      ......处理cTextPS: 请把你现在的cText类型定义贴出来
      

  6.   

    根据你的帖子,模拟了一下,没有任何问题,我把模拟的贴出来,看看能不能有所帮助。
    TCommand = (CLogin, CReg);
      TcText = packed record
        Command: TCommand;
      end;
      TClientForm = class(TForm)
        Button: TButton;
        IdTCPClient: TIdTCPClient;
        ButtonSend: TButton;
        CheckBox: TCheckBox;
        procedure ButtonClick(Sender: TObject);
        procedure ButtonSendClick(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      ClientForm: TClientForm;implementation{$R *.dfm}procedure TClientForm.ButtonClick(Sender: TObject);
    begin
      IdTCPClient.Connect();
    end;procedure TClientForm.ButtonSendClick(Sender: TObject);
    var
      cText: TcText;
    begin
      if CheckBox.Checked then
      cText.Command := CLogin
      else
      cText.Command := CReg;
      IdTCPClient.WriteBuffer(cText, SizeOf(cText));
    end;。。TCommand = (Clogin, CReg);
      TcText = packed record
        Command: TCommand;
      end;
      TServerForm = class(TForm)
        IdTCPServer: TIdTCPServer;
        Memo: TMemo;
        procedure IdTCPServerExecute(AThread: TIdPeerThread);
      private
        sCommandString: string;
      public
        { Public declarations }
      end;var
      ServerForm: TServerForm;implementation{$R *.dfm}procedure TServerForm.IdTCPServerExecute(AThread: TIdPeerThread);
    var
      cText: TcText;
    begin
      AThread.Connection.ReadBuffer(cText, SizeOf(cText));
      case cText.Command of
      CLogin: Memo.Lines.Add('Login');
      CReg: Memo.Lines.Add('Register');
      end;
    end;
      

  7.   

    to:sanmaotuo(老冯) 我的ctext设置为
    const
      Creg = 10001; //注册
      Clogin = 10002;  //登陆
    多个客户端连接后,相互间无操作的情况下,立即退出不报错,但相互间发送消息,或者是其他操作后,退出则报这个错误。环境为delphi 7,网络控件为delphi7自带的IdTCPServer和IdTCPClient
      

  8.   

    我刚用indy组件的idftpserver写完一个ftp服务器,同样碰到线程结束超时的错误,我解决的方法如下:
    获得线程的id后如下操作线程:
     Athread.FreeOnterminated:=true(可以不要,因为indy在完成一个客户连接后,自动销毁线程)
     Athread.connection.disconnect;(调用此事件,实际上就是告诉客户,将结束这个线程,indy会自动销毁)
    try
     Athread.WaitFor
    except
    end;(不如此,程序会报“句柄无效”的错误,因为此时indy可能已经结束了线程)//此时就可以终止服务器了
    idTcpServer.Active:=false(调试时当然有异常,保护起来,脱离调试环境,运行程序,一切ok)
    愿能帮得上你得忙◎!
      

  9.   

    接上面未说完的话:(如果你要终止很多用户,创建一个线程列表,然后循环,在循环中加入上述得处理方法,便一切ok,我就时这样处理得,欢迎使用我得实验品:E-Serv软件,发布在“上传下载的栏目里”,你也可以来信索取:[email protected] .你可以看:我的软件就可以在有客户端连接的时候强行终止客户的连接)
      

  10.   

    参考http://community.csdn.net/Expert/topic/5133/5133182.xml?temp=.605633
      

  11.   

    谢谢各位了!找到处理办法了,将delphi带的indy控件卸载后装了新的9.0.18版本,问题解决!
      

  12.   

    你好!
       我也碰到同样的问题,但装了9.0.18,问题同样有啊!这是我的代码,能帮帮我吗??
    procedure TFrmMain.disAllconnect;
    var
      Place :integer;
      VarTList :TList;
    begin
      VarTList:=Server.Threads.LockList;
      for Place:=0 To VarTList.Count-1 Do
      begin
      try
        TIdPeerThread(VarTList.Items[Place]).Connection.Disconnect;
        TIdPeerThread(VarTList.Items[Place]).WaitFor;
      except  end
      end;
    end;
    关闭时:
    disAllconnect;
    server.active :=false;