请问用D7的IdTCPServer/Client做文件传输,接收端怎么获得每次的流包文件的大小?也就是做个进度条 ( 积分: 100 )

  • 主题发起人 主题发起人 simontown
  • 开始时间 开始时间
S

simontown

Unregistered / Unconfirmed
GUEST, unregistred user!
主要代码是:

Client

FileStream := TFileStream.Create(FileName,fmOpenRead);
FileSize := FileStream.Size;
IdTCPClient1.WriteStream(FileStream,True,True,FileSize);

Sever
FileStream := TFileStream.Create(FileName,fmCreate);
AThread.Connection.ReadStream(FileStream,-1,False);

在局域网中传文件,我想做个进度条,但不知道怎么获得发送的流文件大小,请大虾们指教!!!!
谢谢
 
主要代码是:

Client

FileStream := TFileStream.Create(FileName,fmOpenRead);
FileSize := FileStream.Size;
IdTCPClient1.WriteStream(FileStream,True,True,FileSize);

Sever
FileStream := TFileStream.Create(FileName,fmCreate);
AThread.Connection.ReadStream(FileStream,-1,False);

在局域网中传文件,我想做个进度条,但不知道怎么获得发送的流文件大小,请大虾们指教!!!!
谢谢
 
你这样做肯定是不行的,如果文件很大的话,那么你应该把它拆成小包,然后使用你自己的协议,把大小包括在你的协议里不就可以得到传输的大小的吗,呵呵
 
这种方法我也听说过,但不知道具体怎么做,能给个简单的示例吗?谢谢
 
http://www.wisdomcube.com/stuff/ThreadBlocking.rar
TServerSocket和TClientSocket的ThreadBlocking模式的例子
看看这个合不合你用吧
 
简单的说,
FileStream := ……
FileSize := ……
在这里加入: WriteInteger(FielSize) //*******************************
然后再 IdTCPClient1.WriteStream(FileStream,True,True,FileSize);

在服务器端 在 ReadStream 之前 先 ReadInteger 把filesize读出来
 
FileSize是整个文件的大小吗?那每次的Stream的大小呢?
 
我研究了一下, IdTCPClient1.WriteStream 第三个参数为true的时候,会自动先写字节数上去,因为他的writeinteger不知道有没有变换网络字节顺序,所以还是不要用它缺省的比较好,设置为false吧
发的时候一次writestream发出去就可以了,他会帮你分包的,不会说太大了发不出去
但是接受的时候,你不要接受-1字节这样,你先readinteger知道了字节数
然后你可以1k、1k的接受,不就可以写进度条了
 
数据包头告诉对方长度;
 
1》我研究了一下, IdTCPClient1.WriteStream 第三个参数为true的时候,会自动先写字节数上去,因为他的writeinteger不知道有没有变换网络字节顺序,所以还是不要用它缺省的比较好,设置为false吧
发的时候一次writestream发出去就可以了,他会帮你分包的,不会说太大了发不出去
但是接受的时候,你不要接受-1字节这样,你先readinteger知道了字节数
然后你可以1k、1k的接受,不就可以写进度条了
1>也可以返回每次接受的长度
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
927
SUNSTONE的Delphi笔记
S
Y
回复
3
查看
905
bagel
B
后退
顶部