模擬dns優選,處理dns的響應時間

模擬dns優選,處理dns的響應時間

說明

主要用於選擇更合適的dns解析服務器。能夠自定義配置須要測試的dns地址。 若是大家的寬帶是電信聯通或移動能夠去查詢它們所在城市的dns地址也能夠加入測試java

配置文件 dnstest.ini

#要進行解析的域名
test www.baidu.com
test www.oschina.com
test tv.sohu.com
 
#可用的dns。
dns 8.8.8.8
dns 8.8.4.4
dns 114.114.114.114
dns 114.114.115.115
dns 223.5.5.5
dns 223.6.6.6
dns 1.2.4.8
dns 210.2.4.8
dns 208.67.222.222
dns 208.67.220.220
dns 101.226.4.6
dns 123.125.82.6
dns 123.125.83.6

代碼

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
 
public class DNSSpeed implements Runnable {
    private final InetAddress dns;
    private final String dd;
 
    public DNSSpeed(String dns, String dd) throws UnknownHostException {
        this.dns = InetAddress.getByName(dns);
        this.dd = dd;
    }
 
    public void run() {
        byte[] data = toDnsBytes(dd);
        DatagramSocket dispatcher = null;
        DatagramPacket pack = null;
        boolean isSuccess = false;
        long start = System.currentTimeMillis();
        try {
            pack = new DatagramPacket(data, data.length, dns, 53);
            dispatcher = createDatagramSocket();
            dispatcher.setSoTimeout(1000);
            dispatcher.send(pack);
            data = new byte[512];
            pack = new DatagramPacket(data, data.length);
            dispatcher.receive(pack);
            if (pack.getLength() > 12) {//簡單驗證返回包
                isSuccess = true;
            }
        } catch (Exception e) {
        } finally {
            if (null != dispatcher) {
                dispatcher.close();
            }
            String info = "%-15s\t%-20s\t%s\t%4d\t";
            info = String.format(info, dns.getHostAddress(), dd, isSuccess, (System.currentTimeMillis() - start));
            System.out.println(info);
        }
    }
 
    /**
     * 組dns查詢包
     * 2015年7月14日
     * @param dd
     * @return
     */
    protected static final byte[] toDnsBytes(String dd) {
        ByteBuffer b = ByteBuffer.allocateDirect(512);
        short id = (short) (3 + r.nextInt(1000));
        b.putShort(id);// id;
        b.put((byte) 0x01);
        b.put((byte) 0x00);
        b.putShort((short) (0x01 & 0xFFFF));
        b.putShort((short) (0x00 & 0xFFFF));
        b.putShort((short) (0x00 & 0xFFFF));
        b.putShort((short) (0x00 & 0xFFFF));
        String[] ss = dd.split("\\.");
        for (int i = 0; i < ss.length; i++) {
            byte[] bb = ss[i].getBytes();
            b.put((byte) (bb.length & 0xFF));
            b.put(bb);
        }
        b.put((byte) 0x00);
        b.putShort((short) 0x01);
        b.putShort((short) 0x01);
        b.flip();
        byte[] bb = new byte[b.remaining()];
        b.get(bb);
        return bb;
    }
 
    private static Random r = new Random();
 
    /**
     * 隨機取一個 50000開始的端口
     * 2015年7月14日
     * @return
     */
    private static synchronized DatagramSocket createDatagramSocket() {
        DatagramSocket result = null;
        while (null == result) {
            try {
                int port = 50000 + r.nextInt(10000);
                result = new DatagramSocket(port);
            } catch (SocketException e) {
                result = null;
            } finally {
            }
        }
        return result;
    }
 
    public static void main(String[] args) throws UnknownHostException {
        List<String> config = loadFile("dnstest.ini");
        List<String> dns = getConfig(config, "dns");
        List<String> test = getConfig(config, "test");
        for (String s : dns) {
            for (String t : test) {
                new DNSSpeed(s, t).run();
            }
        }
    }
 
    /**
     * 取key. 配置以 key  value格式
     * 2015年7月14日
     * @param config
     * @param key
     * @return
     */
    protected static final List<String> getConfig(List<String> config, String key) {
        List<String> result = new ArrayList<String>();
        for (String ss : config) {
            ss = ss.trim();
            if (ss.startsWith(key)) {
                result.add(ss.substring(key.length()).trim());
            }
        }
        return result;
    }
 
    /**
     * 加載配置文件轉list
     * 2015年7月14日
     * @param path
     * @return
     */
    protected static final List<String> loadFile(String path) {
        List<String> result = new ArrayList<String>();
        BufferedReader in = null;
        try {
            in = new BufferedReader(new FileReader(path));
            String s = null;
            while (null != (s = in.readLine())) {
                s = s.trim();
                if (!s.startsWith("#") && !s.isEmpty()) {//過濾掉空行及#號開頭的配置
                    result.add(s);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (null != in) {
                try {
                    in.close();
                } catch (IOException e) {
                }
            }
        }
        return result;
    }
}

執行結果

8.8.8.8         www.baidu.com           true      12    
8.8.8.8         www.oschina.com         true       4    
8.8.8.8         tv.sohu.com             true       7    
8.8.4.4         www.baidu.com           true       7    
8.8.4.4         www.oschina.com         true       8    
8.8.4.4         tv.sohu.com             true       6    
114.114.114.114 www.baidu.com           true       5    
114.114.114.114 www.oschina.com         true       6    
114.114.114.114 tv.sohu.com             true       8    
114.114.115.115 www.baidu.com           true       5    
114.114.115.115 www.oschina.com         true       6    
114.114.115.115 tv.sohu.com             true       5    
223.5.5.5       www.baidu.com           true      41    
223.5.5.5       www.oschina.com         true      44    
223.5.5.5       tv.sohu.com             true      42    
223.6.6.6       www.baidu.com           true      40    
223.6.6.6       www.oschina.com         true      45    
223.6.6.6       tv.sohu.com             true      46    
1.2.4.8         www.baidu.com           true       8    
1.2.4.8         www.oschina.com         true       6    
1.2.4.8         tv.sohu.com             true      13    
210.2.4.8       www.baidu.com           true       6    
210.2.4.8       www.oschina.com         true       8    
210.2.4.8       tv.sohu.com             true     187    
208.67.222.222  www.baidu.com           true       5    
208.67.222.222  www.oschina.com         true       6    
208.67.222.222  tv.sohu.com             true       4    
208.67.220.220  www.baidu.com           true       5    
208.67.220.220  www.oschina.com         true       7    
208.67.220.220  tv.sohu.com             true      10    
101.226.4.6     www.baidu.com           true       5    
101.226.4.6     www.oschina.com         true       5    
101.226.4.6     tv.sohu.com             true       6    
123.125.82.6    www.baidu.com           true       5    
123.125.82.6    www.oschina.com         true       7    
123.125.82.6    tv.sohu.com             true       5    
123.125.83.6    www.baidu.com           true       5    
123.125.83.6    www.oschina.com         true       5    
123.125.83.6    tv.sohu.com             true       6
相關文章
相關標籤/搜索