Indy组件:TIdTCPClient.ReadLn(50分)

  • 主题发起人 主题发起人 张鸿林
  • 开始时间 开始时间

张鸿林

Unregistered / Unconfirmed
GUEST, unregistred user!
刚刚接触Indy,就遇到问题
Indy demo: Chat 根本无法运行
跟踪发现
如果没有执行TIdTCPClient.WritedLn

TIdTCPClient.ReadLn会陷入无穷等待中,即使给超时参数如TIdTCPClient.ReadLn(#$A,5)
也一样。
另一个Indy TCP demo:ImageServer 总在TIdTCPServer.OnExecute调用
TIdTCPClient.ReadLn,(这时 buffer中肯定有值)所以没有出现这个问题
如果不能随便调用TIdTCPClient.ReadLn
Chat client的demo中怎能在TTimer.Ontimer事件中调用?
 
...
var
F: Text;
begin
...
TIdTCPClient.ReadLn(F,5);
...
end;
 
James_Bornd_L:
不对吧,TIdTCPClient.ReadLn(F,5)的第一个参数是行结束符号,默认为#10(#$A),
第二个参数是超时时间,毫秒为单位。
我跟踪进去,发现
IdTCPConnection.pas
function TIdTCPConnection.ReadLn(ATerminator: string = LF;
const ATimeout: Integer = IdTimeoutDefault; AMaxLineLength: Integer = -1): string;中
FReadLnTimedOut := ReadFromStack(True, ATimeout, ATimeout = IdTimeoutDefault) = 0;
总是返回false
 
在Indy的Bug报告中查了一下,发现超过500个同样问题
几乎没人理会,在一个根帖中发现有一个人随便回答:
FTP中早已修正,遂下载一个indy10 Beta试试
 
我用过没问题的,不过我的习惯是先发一个字符串长度,再发字符串这样就不用ReadLn了
还有,indy的帮助说得很清楚默认的结束符是EOL是#13#10而不是#10
 
搂主,我也碰倒了同样的问题,不过我下载了最新的indy,demo/chat就好了,
其实chat是针对最新的indy的
 
我的indy最新版本9.0.13
 
后退
顶部