在项目中遇到一个需求,因为一直使用dynamic域名访问数据,检测发现很慢,需要指定ip直接访问.
要基于HttpClient做,Socket方法不实际 ,对项目框架改动太大。所以这里不讨论Socket方式。
需要做的事情:
1、得到对应域名的ip地址;
Process pro = Runtime.getRuntime().exec(PING_DOMAIN);//PING_DOMAIN 对应域名 BufferedReader buf = new BufferedReader(new InputStreamReader(pro.getInputStream()));把ping出来的内容以流的方式解析,截取其中的IP地址
正在 Ping www.a.shifen.com [180.97.33.108] 具有 32 字节的数据: 来自 180.97.33.108 的回复: 字节=32 时间=2ms TTL=56 来自 180.97.33.108 的回复: 字节=32 时间=12ms TTL=56 来自 180.97.33.108 的回复: 字节=32 时间=3ms TTL=56 来自 180.97.33.108 的回复: 字节=32 时间=2ms TTL=56 180.97.33.108 的 Ping 统计信息: 数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失), 往返行程的估计时间(以毫秒为单位): 最短 = 2ms,最长 = 12ms,平均 = 4ms
2、绑定IP
绑定IP也有很大方法,比如IP直连,绑定host,虚拟host等
BasicHttpParams httpParameters = new BasicHttpParams(); HttpConnectionParams.setConnectionTimeout(httpParameters, 15000); HttpConnectionParams.setSoTimeout(httpParameters, 15000); HttpClient httpClient = new DefaultHttpClient(httpParameters); HttpResponse response; try { if (url.contains("www.baidu.com") && PINGIP!=null) { HttpHost httpHost = new HttpHost(PINGIP); ConnRouteParams.setDefaultProxy(httpParameters, httpHost); } HttpGet httpget = new HttpGet(url); response = httpClient.execute(httpget); } catch (UnknownHostException e) { } catch (ConnectTimeoutException e) { } catch (Exception e) { }
HttpMethod method = new GetMethod(url); method.getParams().setVirtualHost("<span style="color:#808080;">180.97.33.108</span>");通过setVirtualHost也能达到想要的效果。
httpClient.getParams().setParameter(ConnRouteParams.LOCAL_ADDRESS, InetAddress.getByAddress(getStringToByte(PINGIP)));getStringToByte(PINGIP)因为getByAddress需要使用Byte的,而byte范围1-127,超过127就需要转换下,比如((byte)180,97,33,108) 网上大量的充斥这种方式直连,这种方式经过验证是不靠谱的,只能绑定本地ip,不是任何ip,达不到需求的效果,所以不建议使用。
基本上就是这些吧,希望分享对其他人有所帮助,有什么更好的办法也可以留言交流
原文地址:http://blog.csdn.net/honjane/article/details/46558775