用DatagramPacket发送数据最快能到什么程度?

GDXY 2007-09-24 12:36:28
我写了个测试程序,客户端不断地发送UDP数据包,服务器端不断地接收,收发的线程优先级都设置为最高,结果两台机器的Networking Utilization(在任务管理器里面的最后一个标签看的)都是50%左右,而此时我再在客户端机器打开迅雷下载一个大文件,下载速度达到300k/s以上,而此时客户端机器的Networking Utilization还是保持50%左右,而服务器端统计的客户发送数据速度也没有明显下降,这让我感觉很奇怪.

首先我不明白为什么是50%? 不能更高了吗? 有没有办法把网卡的发送能力最大程度地利用起来?
...全文
234 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
落雨收衫 2008-05-30
  • 打赏
  • 举报
回复
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

public class UDPClient extends Thread{

public UDPClient(String arg0) throws SocketException{

super(arg0);
socket = new DatagramSocket();

}


private DatagramSocket socket = null;

// private String serverIP = "127.0.0.1";

// public UDPClient() throws SocketException{
//
//
//
// }

// public void setServerIP(String ServerIP){
//
// this.serverIP = serverIP;
//
// }

public void run(){

try{
for(int i = 0;;i++){
// for(int j = 0;j<256;j++){
byte[] buf = new byte[63];
InetAddress address = InetAddress.getByName("61.142.248.24");
if(i%10000==0)System.out.println(address.toString());
DatagramPacket packet = new DatagramPacket(buf,buf.length,address,80);
socket.send(packet);
// }
}
}catch(UnknownHostException e){
e.printStackTrace();
}catch(SocketException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}

}

public static void main(String[] args){

try{
UDPClient client1 = new UDPClient("Thread1");
client1.start();
}catch(SocketException e){
e.printStackTrace();
}

try{
UDPClient client2 = new UDPClient("Thread2");
client2.start();
}catch(SocketException e){
e.printStackTrace();
}

try{
UDPClient client3 = new UDPClient("Thread3");
client3.start();
}catch(SocketException e){
e.printStackTrace();
}
try{
UDPClient client4 = new UDPClient("Thread4");
client4.start();
}catch(SocketException e){
e.printStackTrace();
}

try{
UDPClient client5 = new UDPClient("Thread5");
client5.start();
}catch(SocketException e){
e.printStackTrace();
}

try{
UDPClient client6 = new UDPClient("Thread6");
client6.start();
}catch(SocketException e){
e.printStackTrace();
}

try{
UDPClient client7 = new UDPClient("Thread7");
client7.start();
}catch(SocketException e){
e.printStackTrace();
}

try{
UDPClient client8 = new UDPClient("Thread8");
client8.start();
}catch(SocketException e){
e.printStackTrace();
}

try{
UDPClient client9 = new UDPClient("Thread9");
client9.start();
}catch(SocketException e){
e.printStackTrace();
}
try{
UDPClient client10 = new UDPClient("Thread10");
client10.start();
}catch(SocketException e){
e.printStackTrace();
}

try{
UDPClient client11 = new UDPClient("Thread11");
client11.start();
}catch(SocketException e){
e.printStackTrace();
}

try{
UDPClient client12 = new UDPClient("Thread12");
client12.start();
}catch(SocketException e){
e.printStackTrace();
}

}
}
lixiaoxue85 2007-09-25
  • 打赏
  • 举报
回复
==========================
收发的线程优先级都设置为最高 这个是多余的 JAVA的线程优先级没你想得那么管用==========================
我这边试验结果是设置优先级是有用的,发送的速度由原来的3200条/秒上升到了4500条/秒(每条1.4KB).
==========================
java 的优先级是最难控制东西~~是基于平台的 在LINUX下和WIN下面 虚拟机对于优先级的映射级别个数都不同的. 如果你测试出来有比较明显的改变 可能是优先及 更可能是其他原因

发送越快 丢失的数据包越多
==========================
我不同意这个观点,发送太快导致丢包太多是因为DatagramSocket的缓存设置太小,把缓存设大了就没这个问题了
==========================
把缓存设大了就没这个问题了,UDP本来就是不安全的传输方式.你的缓冲再大也无法阻止传输过程中丢失






GDXY 2007-09-25
  • 打赏
  • 举报
回复
==========================
收发的线程优先级都设置为最高 这个是多余的 JAVA的线程优先级没你想得那么管用==========================
我这边试验结果是设置优先级是有用的,发送的速度由原来的3200条/秒上升到了4500条/秒(每条1.4KB).

==========================
发送越快 丢失的数据包越多
==========================
我不同意这个观点,发送太快导致丢包太多是因为DatagramSocket的缓存设置太小,把缓存设大了就没这个问题了.

有人知道任务管理器里面的Networking Utilization是怎么回事吗?为什么最高总是在50%左右?为什么不能接近100%?
bushuang 2007-09-25
  • 打赏
  • 举报
回复
顶楼上个肺啊
GDXY 2007-09-25
  • 打赏
  • 举报
回复
我知道UDP不是可靠的传输方式,我有自己实现应用层协议的,我不强求UDP自己能保证不丢包,只要不要因为缓存溢出大量丢包就可以了.

这些并不是我最关心的问题,我想知道为什么Networking Utilization最大就在50%左右?是不是意味着并未将网卡的性能发挥到极限? 为什么我在已经达到50%的情况下额外下载东西不会使这个值上升?
lixiaoxue85 2007-09-24
  • 打赏
  • 举报
回复
收发的线程优先级都设置为最高 这个是多余的 JAVA的线程优先级没你想得那么管用
DatagramPacket发送数据最快的取决条件不是在于程序而是在于物理条件 发送越快 丢失的数据包越多===>总结下 LZ的测试毫无意义
zjf405 2007-09-24
  • 打赏
  • 举报
回复
关注一下,^_^
bushuang 2007-09-24
  • 打赏
  • 举报
回复
帮顶
约翰羊 2007-09-24
  • 打赏
  • 举报
回复
不懂.
帮up

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧