如何传送大文件?(300分)

  • 主题发起人 主题发起人 myname
  • 开始时间 开始时间
M

myname

Unregistered / Unconfirmed
GUEST, unregistred user!
近两天写了一个sqlserver客户端备份程序,采用三层结构,winsock连接。
在中间层备份压缩后,通过Olevariant将备份文件传递到客户端,但十多兆
的文件能正常传输,上了二十兆就不行了,出现以下错误提示:
“Windows Socket error: (10055),on API 'recv'”
好象是缓冲区不够,不知道怎么解决?
注:文件到Olevariant的程序代码如下:

VarClear(data);
//data为Olevariant
with TFileStream.Create(backupfilename, fmShareDenyNone)do
try
data := VarArrayCreate([0, Size], varByte);
P1 := VarArrayLock(data);
Read(P1^, Size);
finally
Free;
VarArrayUnLock(data);
end;
 
如果只是将文件发过去的话就比较简单,可以分次发送,每次发送一段数据,客户端也分段接收。
考虑到客户端不知道文件是否结束,应该自己定制一个简单的协议,即通知客户端什么时候
开始接收文件,什么时候接收结束。
 
分段传输达倒是一个办法,但也是不得已的办法
抱着解决问题的态度,我还是想知道传送大文件的方法,
我想应该是有办法的吧。
谢谢你的回答,至少给你50分。
 
是在局域网上吗?如果不是局域网最好分快传输!
如果要用大文件还可以试试编码压缩的方法,现在压缩算法很多,可以找一个高效的。
 
sythree:
是在10/100M局域网,文件已在服务器端压缩了,但还是很大,没办法。
 
分段传输吧,200M试过都没有问题,我刚做完一个,不过代码在家里,
要是明天还没有结束问题的话,我贴给你瞧瞧。
 
其实对于一个大文件来说,从底层来讲都必须分包的,但由于那些东西都是由协议封装了,
所以我们看不见它是怎么做的。在转输大文件时自己进行再次分包也是有意义的,否则如果
文件大小超过可用剩余内存,就要通过硬盘交换,那怎么受得了。
另外你有没有试过用NMStrm和NMStrmServ组件?我试了一下,传大文件时不会出现缓存不足
之类的问题,编码也很简单,而且是由线程执行的,但感觉效率不高,一个33M的文件花了
5分34秒。我们的网络是10/100M,用了交换式HUB。
 
参见:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=714328
我一直使用Stream和Olevariant转换的方法,好像没出过错。
你也可以参考其他方法。
 
up...........
 
我自己写的多线程发送200M的文件都没有问题
 
看来大家的意见都比较统一,还是分段传输吗。
其实这也很简单,多加几行code就行了。
谢谢大家!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部