leehunter 发表于 2015-07-14 09:52

模拟dns优选,处理dns的响应时间

主要用于选择更合适的dns解析服务器。可以自定义配置需要测试的dns地址。
如果你们的宽带是电信联通或移动可以去查询它们所在城市的dns地址也可以加入测试。
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;
            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.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.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. 配置以 keyvalue格式
   * 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.222www.baidu.com         true       5   
208.67.222.222www.oschina.com         true       6   
208.67.222.222tv.sohu.com             true       4   
208.67.220.220www.baidu.com         true       5   
208.67.220.220www.oschina.com         true       7   
208.67.220.220tv.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
页: [1]
查看完整版本: 模拟dns优选,处理dns的响应时间