TIdTCPClient,TIdTCPServer网络传输文件的问题(200分)

  • 主题发起人 主题发起人 jiangxk
  • 开始时间 开始时间
J

jiangxk

Unregistered / Unconfirmed
GUEST, unregistred user!
我用TIdTCPClient,TIdTCPServer进行文件传输
关键代码
接收:
var
AStream:TFileStream;
TCPClient: TIdTCPClient;
...
AStream := TFileStream.Create(SFilename, fmCreate); //创建文件流
TCPClient.ReadStream(AStream,-1,False); //接收文件流
AStream.Free; //释放流
发送:
procedure TPKU_comsvr.PKUTCPServerExecute(AThread: TIdPeerThread);
begin
...
AStream := TFileStream.Create(filename,fmOpenRead);
AThread.Connection.WriteStream(Astream,True,true); //发送文件
AStream.Free;
...
end;
在网络条件好的情况下没有问题,但是在网络情况不好的情况下,有可能在文件传了一半的情况下就停下来了,但是也不报任何错误和异常
现在我想加一个功能就是如果文件传到一半停下来的时候,超过一定的时间就取消文件的传输,并且断开连接,请问有什么好的办法解决判断传送文件超时并断开连接的办法,谢谢了
注:我传输的文件本身并不大,最大的100K
 
如果是1K,绝对不会出错是不是?
这里比较适合自己开发协议对 一问一答方式传送...我已经实现.
可以的但现在比较忙,过几天给你个例程的吧.

不过www.aidelphi.com 的azib已有代码提供了,你看看,希望有帮助.
 
爱!

WriteStream(Astream,True,true); 是一次性发送的,你最好用分片的方法,例如:
const
bsize = 4096;//Internet上最好是1024.
var
_buf:packed array [1..bsize] of char;
ct,lastct:word;
Begin
AStream := TFileStream.Create(filename,fmOpenRead);
ct:=AStream.size div bsize;
lastct:=AStream.size-ct*bsize;
try
while (ct>0) do
begin
AStream.ReadBuffer(_Buf,BSize);
AThread.Connection.WriteBuffer(_Buf,bsize);
dec(ct);
end;

// 发送最后的内容!
if (lastct>0) then
begin
AStream.ReadBuffer(_Buf,lastct);
AThread.Connection.WriteBuffer(_Buf,lastct);
end;
finally
AStream.Free;
end;
End;


 
后退
顶部