IdTCPServer、IdTCPClient 文件传输出错。 ( 积分: 100 )

  • 主题发起人 主题发起人 YuYu200508
  • 开始时间 开始时间
Y

YuYu200508

Unregistered / Unconfirmed
GUEST, unregistred user!
错误描述:上传的文件的头几个字节被修改,如果上传的是文本文件,头几个字符被改为怪异字符。

源码如下:
客户端,发送文件
procedure Send;
var
FileStream: TFileStream;
begin
// IdTCPClient1.Connect();
FileStream := TFileStream.Create(Edit3.Text,fmOpenRead );
try
IdTCPClient1.OpenWriteBuffer();
//FileStream.Position := 0;
IdTCPClient1.WriteStream(FileStream, True, True);
IdTCPClient1.CloseWriteBuffer();
finally
FileStream.Free;
end;
IdTCPClient1.Disconnect;
end;

服务器段,接受文件
procedure TFormMain.IdTCPServer1Execute(AThread: TIdPeerThread);
var
ThisCon: TIdTCPServerConnection;
//cmd: string;
FileStream: TFileStream;
begin
ThisCon := AThread.Connection;
begin
FileStream := TFileStream.Create(Edit2.Text, fmCreate);
try
//FileStream.Position := 0;
ThisCon.ReadStream(FileStream, -1 , True);
finally
FileStream.Free;
end;
end;
end;
 
错误描述:上传的文件的头几个字节被修改,如果上传的是文本文件,头几个字符被改为怪异字符。

源码如下:
客户端,发送文件
procedure Send;
var
FileStream: TFileStream;
begin
// IdTCPClient1.Connect();
FileStream := TFileStream.Create(Edit3.Text,fmOpenRead );
try
IdTCPClient1.OpenWriteBuffer();
//FileStream.Position := 0;
IdTCPClient1.WriteStream(FileStream, True, True);
IdTCPClient1.CloseWriteBuffer();
finally
FileStream.Free;
end;
IdTCPClient1.Disconnect;
end;

服务器段,接受文件
procedure TFormMain.IdTCPServer1Execute(AThread: TIdPeerThread);
var
ThisCon: TIdTCPServerConnection;
//cmd: string;
FileStream: TFileStream;
begin
ThisCon := AThread.Connection;
begin
FileStream := TFileStream.Create(Edit2.Text, fmCreate);
try
//FileStream.Position := 0;
ThisCon.ReadStream(FileStream, -1 , True);
finally
FileStream.Free;
end;
end;
end;
 
在Indy的Demo中有IdTCP文件传输的例子(在Indy/ImageServer目录)
 
仔细对照Demo,发现参数设置错了。
procedure TIdTCPConnection.WriteStream(AStream: TStream; const AAll: boolean = true; const AWriteByteCount: Boolean = False; const ASize: Integer = 0);
使用默认的参数就行了,
我的这句 IdTCPClient1.WriteStream(FileStream, True, True); 不对。
察看源码后知道,如果 AWriteByteCount == true ;那么,要把字节数量写到发送的流里面。
还有一种改法,在服务器端,增加一句:AllCont := ThisCon.ReadInteger(); 也就把附加的那个表示这段流大小的数字得到了。

服务器端还需要修改:while ThisCon.connected do ThisCon.ReadStream(FileStream, -1 , True);

嘿嘿,没用不知道,这个Indy设计的好精巧呀。
 
我怎么觉得你的文件传输设计得有问题,

服务器端是怎么知道客户端传输的文件名的???
 
后退
顶部