我用idTcpServer和idTcpClient开发一个程序,有10几个客户端用writeln()实时向服务器发送字符串,最后基本上会同时向服务器发送一个字符串,现在的问题是:在程序运行期间服务器端经常在OnDisconnect事件里检测到有客户端断线,并且在最后客户端同时传一个字符串上来时经常会有个别客户端的信息接收不到
请问这是怎么回事,是Indy的问题吗?

解决方案 »

  1.   

    服务器收不到客户端信息的时候,客户端没有任何异常发生
    关于发送数据的函数代码如下:
    procedure TForm1.SendData( l:string);
    var Data:string;
    begin
      Data:=l;
      try
        TCPClient.writeln(Data);
        data:='';
      except
        TCPClient.Disconnect;
        TCPClient.Host:=HostName;
        try
          TCPClient.Connect(200);
          SendData(Data);
          Data:='';
        except
          Application.MessageBox('TCP连接失败',MB_TOPMOST+MB_ICONExclamation);
        end;
      end;
    end;
      

  2.   

    改一下:
    procedure TForm1.SendData( l:string);
    begin
     try
      TCPClient.writeln(l);
     except
      application.messagebox('发送信息失败!','提示');
    end;
    procedure TForm1.ConnectServer;
    begin
      TCPClient.Host:=HostName;
        try
          TCPClient.Connect(200);
        except
         TCPClient.Disconnect(); 
         Application.MessageBox('TCP连接失败,主机无响应','提示');
        end;
      end;
    end;
    procedure sendinfo();//发送信息的处理单元
    begin
     ConnectServer;
     SendData(edit1.text);
    end;
      

  3.   

    还有就是ConnectServer建立连接的过程的超时设长点最好是1000以上,然后建立连接这句只执行一次就行,以后再发送信息时直接发送,不要总是不行就断开连接,因为多个客户端同时与服务端连接的话,容易阻塞的,一旦阻塞了,就得等一会,一等如果超时你写的程序就断开了,还得重连,那么服务器当然提示有客户端断开了.
      个人见解,仅供参考!
      

  4.   

    to yuti():
    从代码的逻辑上看,你写的代码和我写的差不多,我也是把连接和发送分离了,只不过用了一个递归在发送的时候如果出现异常,用了一个递归断开并重新连接,然后再次尝试发送数据。
    在网上看到一篇文章说发送字符串的时候如果字符串长度超过255就会出现错误,不知道是不是有这个问题。
      

  5.   

    唉~
    最好采用确认机制
    即用SendCmd方法
      

  6.   

    高手,能不能解释一下SendCmd的机制和使用方法,拜托了
      

  7.   

    怎么回事,怎么没人来,用tcp同时监听10个客户端就会有问题吗?
      

  8.   

    msg:=AThread.Connection.ReadLn();
    AThread.Connection.WriteLn('200');  //客户端发送代码是  tcpClient.sengcmd(data,200);
    //***********************************//这里是一些数据处理的代码//**********************************