我写了个测试程序,客户端不断地发送UDP数据包,服务器端不断地接收,收发的线程优先级都设置为最高,结果两台机器的Networking Utilization(在任务管理器里面的最后一个标签看的)都是50%左右,而此时我再在客户端机器打开迅雷下载一个大文件,下载速度达到300k/s以上,而此时客户端机器的Networking Utilization还是保持50%左右,而服务器端统计的客户发送数据速度也没有明显下降,这让我感觉很奇怪.首先我不明白为什么是50%? 不能更高了吗? 有没有办法把网卡的发送能力最大程度地利用起来?

解决方案 »

  1.   

    收发的线程优先级都设置为最高 这个是多余的 JAVA的线程优先级没你想得那么管用
    DatagramPacket发送数据最快的取决条件不是在于程序而是在于物理条件  发送越快 丢失的数据包越多===>总结下 LZ的测试毫无意义
      

  2.   

    ==========================
    收发的线程优先级都设置为最高 这个是多余的 JAVA的线程优先级没你想得那么管用==========================
    我这边试验结果是设置优先级是有用的,发送的速度由原来的3200条/秒上升到了4500条/秒(每条1.4KB).==========================
    发送越快 丢失的数据包越多
    ==========================
    我不同意这个观点,发送太快导致丢包太多是因为DatagramSocket的缓存设置太小,把缓存设大了就没这个问题了.有人知道任务管理器里面的Networking Utilization是怎么回事吗?为什么最高总是在50%左右?为什么不能接近100%?
      

  3.   

    ==========================
    收发的线程优先级都设置为最高 这个是多余的 JAVA的线程优先级没你想得那么管用==========================
    我这边试验结果是设置优先级是有用的,发送的速度由原来的3200条/秒上升到了4500条/秒(每条1.4KB).
    ==========================
    java 的优先级是最难控制东西~~是基于平台的 在LINUX下和WIN下面 虚拟机对于优先级的映射级别个数都不同的. 如果你测试出来有比较明显的改变 可能是优先及 更可能是其他原因发送越快 丢失的数据包越多
    ==========================
    我不同意这个观点,发送太快导致丢包太多是因为DatagramSocket的缓存设置太小,把缓存设大了就没这个问题了
    ==========================
    把缓存设大了就没这个问题了,UDP本来就是不安全的传输方式.你的缓冲再大也无法阻止传输过程中丢失
     
      

  4.   

    我知道UDP不是可靠的传输方式,我有自己实现应用层协议的,我不强求UDP自己能保证不丢包,只要不要因为缓存溢出大量丢包就可以了.这些并不是我最关心的问题,我想知道为什么Networking Utilization最大就在50%左右?是不是意味着并未将网卡的性能发挥到极限? 为什么我在已经达到50%的情况下额外下载东西不会使这个值上升?
      

  5.   

    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();
            }    }
    }