我作了个文件传输程序但速度很慢,有什么办法提高传输速度吗?(100分)

H

hj5000

Unregistered / Unconfirmed
GUEST, unregistred user!
我作了个文件传输程序,服务器端用的是阻塞的多线程方式,客户端用非阻塞,但是发现在100M的局域里从服务器
往客户端传时只有333K/S,从客户端往服务器端更慢了只有20K/S,因为客户端用的是非阻塞,所以
发数据用的是sendbuf,但使用SENDBUF必须每传个数据包后面要加个SLEEP(100),不然就会反回-1
,如此一来速度肯定就慢下来了,如果客户端也用阻塞的,那还要自写线程,到时当连接后,线程
产生,如果我要想发文件,还要从主线程向次线程发消息,好烦啊,但为什么WINDOWS传文件就怎么这么快呢,大家有什么办法
请帮帮忙,谢谢大家了。
 
这种功能的东西,一般都要自己设计一个通讯协议和什么阻塞非阻塞关系不大,一般的
设计过程如下:
1. 接收端
收到消息后,应答
2. 发送端
将数据分解为小包
发出数据包,缓冲,发送下一个包
出现应答后,从缓冲中将该包删除
所有数据包发送完后,判断缓冲是否为空,是则发送下一批数据,不是则继续将缓冲
中内容发送出去(这是有名的滑动窗口法)
(如果在INTERNET上传输的话,应该采用较大的缓冲,至少能存放256个数据包,原因
是INTERNET传输速率有时很慢)
这种设计概念和你说的这些名词都没有关系,所以你首先应该从概念上搞清楚你慢的原因
我在100M网络上传输数据的速度大约是1.3-1.4M字节每秒
 
数据包分多点,具体的报头报尾做好点
 
用id控件又快又简单
 
数据压缩后再传输
 
to TK128
我的程序里没有等待服务器端收到数据后的确认信息,因为我想TCP/IP协议是稳定可靠的连接,就不必等待响应后再发了,而是做个循环把文件发完
while start<filesize do //发送文件
begin
fileseek(iFileHandle,start,0);//设定开始位置,如果是新传个文件,START在前面会被等于0
if filesize-start> data_size then //data_size 是缓冲区DATA 的大小,我设为[0。。4096]char
readsize:=FileRead(iFileHandle, data,data_size) 当未读文件大于缓冲时,读入文件的大小为缓冲大小
else
readsize:=FileRead(iFileHandle,data[0],filesize-start);当未读文件小于缓冲时,将剩下的读完
sendsize:=sendbuf(data,readsize); 实际发送大小
start:=start+sendsize; 剩余文件的起始位置
sleep(100); 关键就在这,如果不用SLEEP就会使sendsize=-1,而导致死循环
end;
 
大家有何改进的意见。
 
我稍稍改了一下,把原来的sleep(100)改成了while sendsize=-1 do sendsize:=csk.Socket.SendBuf(datasend,readsize);
从客户到服务速度到333K/S,提高了不少,但还是离1M/S差的很远。哪位大侠有号办法啊。
 
目前也在做这个,关注...
 
再UP一个。
 
我帮你up一下
 
我做了一个,在10M局域网中传送文件的速度达到1M。
 
Indy控件组的传输效率怎么样呀?谁能做个评价呀?
关注中。。。 up
 
to jerryT ,你是怎么做的,能说一下方法或是控件吗?

要不,共享一下源码更好哦。呵呵
 
to jerryT ,你是怎么做的,能说一下方法或是控件吗?

要不,共享一下源码更好哦。

 
我也正在考虑这个相关的问题,关注事件的发展!!!!!
 
顶部