我写了个测试程序,客户端不断地发送UDP数据包,服务器端不断地接收,收发的线程优先级都设置为最高,结果两台机器的Networking Utilization(在任务管理器里面的最后一个标签看的)都是50%左右,而此时我再在客户端机器打开迅雷下载一个大文件,下载速度达到300k/s以上,而此时客户端机器的Networking Utilization还是保持50%左右,而服务器端统计的客户发送数据速度也没有明显下降,这让我感觉很奇怪.首先我不明白为什么是50%? 不能更高了吗? 有没有办法把网卡的发送能力最大程度地利用起来?
DatagramPacket发送数据最快的取决条件不是在于程序而是在于物理条件 发送越快 丢失的数据包越多===>总结下 LZ的测试毫无意义
收发的线程优先级都设置为最高 这个是多余的 JAVA的线程优先级没你想得那么管用==========================
我这边试验结果是设置优先级是有用的,发送的速度由原来的3200条/秒上升到了4500条/秒(每条1.4KB).==========================
发送越快 丢失的数据包越多
==========================
我不同意这个观点,发送太快导致丢包太多是因为DatagramSocket的缓存设置太小,把缓存设大了就没这个问题了.有人知道任务管理器里面的Networking Utilization是怎么回事吗?为什么最高总是在50%左右?为什么不能接近100%?
收发的线程优先级都设置为最高 这个是多余的 JAVA的线程优先级没你想得那么管用==========================
我这边试验结果是设置优先级是有用的,发送的速度由原来的3200条/秒上升到了4500条/秒(每条1.4KB).
==========================
java 的优先级是最难控制东西~~是基于平台的 在LINUX下和WIN下面 虚拟机对于优先级的映射级别个数都不同的. 如果你测试出来有比较明显的改变 可能是优先及 更可能是其他原因发送越快 丢失的数据包越多
==========================
我不同意这个观点,发送太快导致丢包太多是因为DatagramSocket的缓存设置太小,把缓存设大了就没这个问题了
==========================
把缓存设大了就没这个问题了,UDP本来就是不安全的传输方式.你的缓冲再大也无法阻止传输过程中丢失
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();
} }
}