IdTCPClient 怎么才能正常接收到数据 (300分)

  • 主题发起人 主题发起人 大愚
  • 开始时间 开始时间

大愚

Unregistered / Unconfirmed
GUEST, unregistred user!
我用IdTCPClient连接另一个设备,用IdTCPClient1.ReadBuffer()可以得到返回的数据,但只能自己定义收取多少字节,无法知道返回的是实际是多少字节。用IdLogStream和IdLogEvent却无法得到返回信息,IdLogStream和IdLogEvent起什么用?怎么用?敬请高手指教。
 
Indy使用阻塞方式通讯,readbuffer只有在你指定的缓冲区填满才会返回,客户端不可能知道有多少数据,其实你只要在服务端发送数据之前发送一个数据包告诉客户端有多少数据就可以了。IdLogStream是使用流方式传送数据,接收收据要用stream的read方法,IdLogEvent是用响应事件的方式,接收收据要使用OnReceived
 
1.如果你用的是Indy8.0:
a.測試目前緩衝區收到數據的字節數:
var DataSize:Integer;
begin
IdTCPClient1.ReadFromStack(False);
DataSize:=TCP.CurrentReadBufferSize;
end;
b.讀取目前收到的所有數據:
var
Data:string;
begin
Data:=IdTCPClient1.CurrentReadBuffer;
end;
2.如果你用的是Indy9.0:
a.測試目前緩衝區收到數據的字節數:
var DataSize:Integer;
begin
IdTCPClient1.ReadFromStack(false);
DataSize:=IdTCPClient1.InputBuffer.Size;
end;
b.讀取目前收到的所有數據:
var
Data:string;
begin
Data:=IdTCPClient1.CurrentReadBuffer;
end;
 
To:乡村月光
我用IdTCPClient连接的是另一个设备,只知道是用的TCP/IP。
发送数据后,OnReceived无法响应,当用IdTCPClient1.CurrentReadBuffer后,OnReceived才能得到返回数据,每次发送后都要用一次IdTCPClient1.CurrentReadBuffer,不知为什么。
To:smokingroom
Data:=IdTCPClient1.CurrentReadBuffer;没有得到任何信息。只是让IdLogStream或IdLogEvent得到OnReceived事件,直接用IdTCPClient1.CurrentReadBuffer;也是一样的。
 
没用过这个,我一直都是用TClientSocket,不知道这两者有什么区别。
 
估計是響應時間的問題.
var
Data:string;
begin
IdTCPClient1.ReadFromStack(false,1000,True,nil); //1000為待待一秒
Data:=IdTCPClient1.CurrentReadBuffer;
end;
 
返回时间很快,大概1ms左右
 
U:=IdTCPClient1.ReadFromStack(false);
IdTCPClient1.Socket.Recv(P^,U);
包的大小设定为1024
 
现在那个设备被借走了,试不了,等还回来后就试一下.

没人知道IdLogStream和IdLogEvent具体用法吗?
 
问题依旧,为什么实际上有数据返回,IdLogEvent的OnReceived事件没有反应?
 
没人回答,算了,再想办法
 
多人接受答案了。
 
后退
顶部