我在用idTCPserver和idTCPClient相互传递字符串,客户端运行中接受完数据后就没有反应了,F8跟踪后发现
到从buffer中读完数据后就停止在 msg := idtcpclient1.ReadLn();
可以接受直到服务端有writln数据,就是客户端不能操作,直到把timer.active = false。
是不是在timer中idtcpclient1.ReadLn()取完数据后一直在那里等待服务端的消息?这样肯定不行我还有在客户端输数据,是啥原因?
这个例子是Demo中搬过来的,运行Demo也是这样。
怎么办????我可是第一次做网络开发,这应该是最基本的吧!!客户端中timer:
procedure Tc_main.Timer1Timer(Sender: TObject);
var
  msg : String;
begin
  try
    if not idTCPClient1.Connected then
       exit;
    msg := idtcpclient1.ReadLn();
    ListBox1.Items.Add(msg) ;
  except
    Button2.Click
  end;  
end;

解决方案 »

  1.   

    如果SERVER一直没有发,idtcpclient1.ReadLn();程序就死了一样
    idtcpclient1.ReadLn();不能加到TIMER中。最好建一个线程,进行读取。
    这几天刚好也搞到这个通讯控件,大家可以交流一下。
      

  2.   

    Readln啊Readln...就是Read + ln 啊,
    这个-ln 通常表示行结束符啊回车符啊之类意思, 这种表示风格有些年头了.它就是等待对端发回车换行符过来这个调用才会返回的!这本是INDY系列控件精力封装的一个功能。要知道 ,TCP SOCKET API这一层只提供了可靠的数据流服务,并没有提供发送与接收应答的数据同步。INDY是在上面做了一些封装,这样可以在很多情况下简化开发。Readln缺省是#0D0A符来同步接收,它也可以让你在参数中指定特定字符串来作为同步符。
    这种机制,在接收HTTP协议串或XML串之类的串风格的数据时,再方便不过了。
      

  3.   

    前段时间好像讨论过这个问题,是不是indy9的DEMO?
      

  4.   

    idTCPClient接收过程放到线程中进行
      

  5.   

    我前面回的好象有些偏题了..汗..楼主试试拖了一TIdAntiFreeze控制到FORM上吧.
    也许就这样能够达到想到的要求,如果不满意这样效果,也只有创建个线程里面接收数据.