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