困惑。在INTERNET上传输大量数据的问题.(200分)

  • 主题发起人 主题发起人 zlbati9
  • 开始时间 开始时间
Z

zlbati9

Unregistered / Unconfirmed
GUEST, unregistred user!
使用SOCKET在在INTERNET上传输大量数据到SERVER,比如一个100M的文件。
现在采用应答方式,将文件分包传送,当SERVER收到一个包后再发下一个包。
觉得,不管采取组塞或非组塞的方式,传输的总的时间都会很长。因为每次传输的数据量有限,那么传输次数就有很多很多次。

想请教大家,有什么办法能缩短总的传输时间。是不是和SERVER建立很多连接,将文件在这些连接上同时分包发送?然后在SERVER端组合?但个人觉得并不是这样。请大家指导!谢谢
 
请问有人知道吗?

或则你们做的程序,在广域网上传送大容量文件,比如100M要多久?
 
根本没有必要一个包发完后,等待对方的回复再发下一个包,这样效率太低了
直接发送数据就是了,稍微控制一下就可以了,具体的看我以前发的帖子,里
面有一些代码
 
不用应答也可,但你一次能发多少?100M要多少次?想想整个传输时间,能短吗?
你的应用在广域网上的发送100M大小的用时大概是多少?谢谢指导.
 
一次把100M都发完呀,当然不是一个包就发完,
速度如何,要看你用了什么网线和网卡还有
时候整个网络的繁忙程度
 
6M/s 我曾经的速度
 
我现在制定的数据包是一次携带2K的数据,服务端用笔记本拨号上线调试,发1M的文件就要很长时间,不敢想象发100M要多久.你看怎么能到楼上的说的"6M/s 我曾经的速度 "阿!

还有,刚才搜你的帖子,发现你也是湖北人,老乡阿!请继续指导!
 
那是我在100M局域网上的速度,呵呵
 
这个速度可以是可以猜出来的,100M当然打个折扣,根据一般人的算法,达对折
也就是50M,然后除以8,呵呵,6,25M/S呵呵是最大值
 
发送端可以这样的。接收端就是在事件里循环收到无数据即可。本来是可以给你源代码的,但被我删了。

Var
sending,sent,index,temp:Longint;
s:String;
begin
temp:=size;
sent:=0;
Index:=1;
While sent<temp do
Begin
sending:=ClientSocket.Socket.SendBuf(BufPointer(data)[index],Temp);
If sending<>-1 Then
Begin
sent:=sent+sending;
index:=index+sending;
temp:=temp-sending;
End;
End;

速度和你用的网络连接有关。用多线程是个不错的方法。
 
谢谢大家参与,这个问题我解决了。
其实我的问题是这样的:我想将文件数据和其他命令信息都定义成自己格式的数据包来发送接受。但是,在不同的网络状况下,发送和接受的大小有很大区别,所以,数据包的边界无法确定,不能通过某种手段来识别是文件包还是命令包。很多人的处理方式是应答后就只管接受数据了,不去判断是什么类型的包,也就是说在开始接受文件信息后,就将收到的字节只管写文件就OK了,比如firstrose帖出来的代码。我原想可以按自己定义的数据包的长度来接受解包处理,现在发现存在上述的问题,所以采用别的方式了。

TO 爱元元的哥哥:局域网和广域网还是有区别的,我就是在局域网调试无问题,到广域网才找到问题了的。
TO 张无忌:在QQ上和你讨论过了,现已解决,谢谢。
TO firstrose:谢谢你,我的代码是多线程处理的。其实你的客户端SENDSTREAM一次也是一样的,可以去看此控件的源码,SENDSTREAM里面也是循环发送的,而且对发送位置控制的很好,首先记下发送起始位,为-1就复位,其他的发多少就移动位置多少。

很高兴能得到各位的指导,还想听听各位高手关于我描述的问题的意见。
若没有,2个小时后结帐。
 
这不是网络上的数据包路由的概念吗?! 赫赫。楼上的能不能把怎么解决的
稍微说一下啊!:)
 
多人接受答案了。
 
怎么呢?你的想法没问题啊.
边界问题好解决:
1、包分2种:命令包和数据包。命令包定长,说明数据包长度。数据包不定长。
2、把接收的东西先用流缓冲,再用线程判断边界。
3、http://www.swm.com.cn/rj/rj-99-11/991122.html
 
后退
顶部