java socket多客户端下载文件限制?

akeng 发布于 2013/12/22 22:49
阅读 469
收藏 1
服务器端有个文件,现在有多个客户端同时下载,在真实应用中会不会出现部分客户端没分到流量或者丢包的情况?服务器端的带宽较小。求解答,谢谢各位大侠。
加载中
0
狮子的魂
狮子的魂

多个进程/线程累积的流量达到总带宽了,是有可能的。

可以通过设置服务器一次发送数据的大小和发送频率,或者动态的调节下下载客户端的TCP数据包的窗口大小可以缓解这个问题。。。

0
宅男小何
宅男小何

会的!限制同时下载的客户端的数量。当达到总带宽的时候,比如(98%),在连上客户端就让client等待(比如放在一个缓冲池中)。此时有个client下载完了,那么就再从缓冲池中取一个。

当然客户端等待要设置超时时间的,超时了要返回给客户端,让其重新点击下载之类的。

akeng
akeng
回复 @宅男小何 : 那我做的简单点,请教下:如果只有一个客户端连上来,如和限制这个客户端的流量?
宅男小何
宅男小何
回复 @akeng : 这256字节不能共享啊,只能传给一个client的啊。同时处理4个client,当然是4个线程啊。每个线程处理一个client。
akeng
akeng
回复 @宅男小何 : 我一开始也是这么想的,服务器端发1M/每秒。不管几个客户端他们每秒只能共享这1M。不知道怎么实现。。。
akeng
akeng
回复 @宅男小何 : 额,其实我的问题就是在这里,我不明白每次发的这256如何被四个client共享,没搞明白啊。
宅男小何
宅男小何
回复 @akeng : 你不能一次就把带宽占满啊,你这样同时只能处理一个client下载了,比如1m,你可以每次发送256,这样4个client同时下载(实际情况应该不能达到4个)!
下一页
0
akeng
akeng

引用来自“狮子的魂”的答案

多个进程/线程累积的流量达到总带宽了,是有可能的。

可以通过设置服务器一次发送数据的大小和发送频率,或者动态的调节下下载客户端的TCP数据包的窗口大小可以缓解这个问题。。。

每秒发送一定的数据,一秒没有发送完下一秒在继续发送剩下的部分这种方式可以么?

就是比如900k一秒发了800k下一秒在发100k

0
狮子的魂
狮子的魂

引用来自“akeng”的答案

引用来自“狮子的魂”的答案

多个进程/线程累积的流量达到总带宽了,是有可能的。

可以通过设置服务器一次发送数据的大小和发送频率,或者动态的调节下下载客户端的TCP数据包的窗口大小可以缓解这个问题。。。

每秒发送一定的数据,一秒没有发送完下一秒在继续发送剩下的部分这种方式可以么?

就是比如900k一秒发了800k下一秒在发100k

其实这个只是一个勉强的方法,发送数据的首先暂存在TCP的发送缓冲区中。至于缓冲区的数据一次发送多少,是由接收端的数据头的窗口大小和带宽决定的。具体可以这样吧:

1. 发送端: 控制下发送缓冲区大小,一般程序不主动flush,发送的数据都会暂存在缓冲区中,等缓冲区满了再一起发送,将缓冲区的大小调节到一定的值可以控制流量,当然还和发送频率有关,不过这个不是重点。

2. 客户端:适当的调节客户端数据包的窗口大小,窗口大小决定了服务器一次可以发送的最大字节数。你们的客户端是自己开发的,可以在客户端控制,最好的方法是动态的通过服务器来调节,总体流量情况只有服务器知道,也就是通过服务器发送一个设置数据来调节客户端的数据包窗口大小。

你举的例子就是这个道理,不过这个控制最靠谱的方式就是控制数据包的窗口大小。

当然,这个过程是可以模拟的,例如,write了n个字节后(n为程序计算的一个进程/线程一次可以发送最大字节数),再flush一下,就控制了流量了。。。

返回顶部
顶部