HttpClient ip直连域名问题那些事

android 专栏收录该内容
107 篇文章 0 订阅

在项目中遇到一个需求,因为一直使用dynamic域名访问数据,检测发现很慢,需要指定ip直接访问.

要基于HttpClient做,Socket方法不实际 ,对项目框架改动太大。所以这里不讨论Socket方式。


需要做的事情:

1、得到对应域名的ip地址

  •       通过InetAddress,提供两个方法InetAddress.getByName("www.baidu.com")得到单个ip和InetAddress.getAllByName("www.baidu.com")得到一组ip地址。这个方式有时候不准确,请根据实际需求使用。
  •       通过ping命令获取,这个比较靠谱一点。
    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等

  •          绑host也是经常使用的方法,比如在测试时候 ,不同服务器的切换,都是通过绑定host访问的。我这里说的是某个域名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) {
              
            }
  •  在HttpClient 4.2以上的jar包中提供了HttpMethod
    HttpMethod method = new GetMethod(url);
    method.getParams().setVirtualHost("<span style="color:#808080;">180.97.33.108</span>");  
    通过setVirtualHost也能达到想要的效果。
  • ip直连方式,这种方式很多公司都不支持,被服务器过滤了,不够百度支持可以用来测试。说直白点就是把www.baidu.com直接用ping出来ip地址代替。
  • InetAddress方式,这种方式的缺陷是不能绑定任意ip只能绑定电脑本身的ip,通过InetAddress.getByAddress(PINGIP);
      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,达不到需求的效果,所以不建议使用。


基本上就是这些吧,希望分享对其他人有所帮助,有什么更好的办法也可以留言交流

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页

打赏作者

阁楼猫

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值