IdTCPServer多客户端同时请求传文件出错

formernetcn 2009-09-21 04:35:30
IdTCPServer 开发服务器端
IdTCPClient 开发客户端

S 为服务器端

Delphi(Pascal) code
private
{ Private declarations }
AFileStream: TFileStream; //传输的文件流

procedure Tf_main.IdTCPServer1Execute(AThread: TIdPeerThread);
begin
with AThread.Connection do
begin
sCommand := ReadLn();
if AnsiStartsText('down@@',sCommand) then
begin
filepath:='f:\共公盘\'+copy(sCommand,Pos('@@',sCommand)+2,length(sCommand));
AFileStream := TFileStream.Create(filepath, fmOpenRead);
end;
if sCommand = 'BEGIN' then //开始传输
begin
//告诉远程传输文件的大小和文件名
WriteLn(Format('%d|%s', [AFileStream.Size,'xxx']));
Exit;
end;
//按照指定位置传输文件
AFileStream.Seek(StrToInT(sCommand), soFromBeginning); //转到文件流传输的位置
ASize := Min(AFileStream.Size - AFileStream.Position, RecvBufferSize);
//计算需要发送的大小,Min()函数在Math单元
OpenWriteBuffer; //准备发送缓冲
WriteStream(AFileStream, false, false, ASize);
//注意这个函数的参数。
CloseWriteBuffer; //结束发送缓冲


end;
end;



当客户A和B同时向S发送请求传送文件时就会出错,应该是AFileStream已经被基中一个请求创建,

在内存没有释放之前再接到创建的请求,这样就有冲突了。

有什么好的办法让他们可以发出请求而不会出错.
...全文
94 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
dahai9825 2009-09-21
  • 打赏
  • 举报
回复
另外你要在后面加上一个while循环 因为你无法保证RecvBufferSize小于AFileStream.Size的情况下能够一次传输完毕
dahai9825 2009-09-21
  • 打赏
  • 举报
回复
你应该要知道IdTCPServer1Execute函数的代码是在一个线程环境中执行的 而你的AFileStream对象是一个窗体的成员变量 在你的IdTCPServer服务线程里面根本没处理AFileStream对象同步的问题 而且这个AFileStream对象也没法在IdTCPServer服务线程里面同步

你可以将AFileStream定义为一个IdTCPServer1Execute函数的局部变量来处理
wintergoes 2009-09-21
  • 打赏
  • 举报
回复
那就用多线程,每个线程处理一个文件
formernetcn 2009-09-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 bdmh 的回复:]
引用 2 楼 formernetcn 的回复:
那如果两个用户请求下载不是同一个文件,但是在同一时间发出的,那怎么办呢

假如不是同一个文件,那应该不是问题
[/Quote]

同一文件没有问题 ,不同文件就出问题
bdmh 2009-09-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 formernetcn 的回复:]
那如果两个用户请求下载不是同一个文件,但是在同一时间发出的,那怎么办呢
[/Quote]
假如不是同一个文件,那应该不是问题
haitao 2009-09-21
  • 打赏
  • 举报
回复
是不是打开模式不对?
2个线程打开同一个文件进行只读操作应该是可以的吧
formernetcn 2009-09-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bdmh 的回复:]
共享同一个文件流,不要多个流同时试图打开同一个文件
[/Quote]

那如果两个用户请求下载不是同一个文件,但是在同一时间发出的,那怎么办呢
bdmh 2009-09-21
  • 打赏
  • 举报
回复
共享同一个文件流,不要多个流同时试图打开同一个文件

5,939

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧