HttpClient ip直连域名问题那些事

在项目中遇到一个需求,因为一直使用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,达不到需求的效果,所以不建议使用。

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

时间: 2024-10-07 10:13:13

HttpClient ip直连域名问题那些事的相关文章

DNS优化之IP直连

移动互联网中,DNS解析的失败率是联网失败中占比很大的一种.为了优化这个问题,我们使用了IP直连.即,从服务器拉取一个配置文件,里面包含域名到IP映射.客户端每次联网时根据域名在配置文件中查找到对应IP,直接使用IP进行请求. 这里有几个地方需要注意: 1.配置文件拉取.使用Get请求,尽量使用请求Url简单,减少出错概率.并且这个时候不能使用IP直连,避免IP改变时拉取失败. 2.Host头设置.对于一个IP主机挂载多个Server的情况,在使用IP直连时,Host头需要设置域名.这里有个特殊

hosts文件该怎么设置?将IP地址与域名绑定的教程

如何绑定hosts文件?怎么将IP地址与域名绑定?作为小编肯定需要hosts来绑定公司ip地址,但是很多人不知道怎么修改设置hosts呢?下面分享将IP地址与域名绑定的教程,需要的朋友可以参考下 什么是Hosts文件? Hosts是一个没有扩展名的系统文件,主要作用是定义IP地址和主机名的映射关系,就是将一些常用的域名网址与其对应的IP地址建立一个关联"数据库",当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,如果找到,系统会立即打开对应网

【Web探索之旅】第三部分第二课:IP地址和域名

内容简介 1.第三部分第二课:IP地址和域名 2.第三部分第三课预告:协议 第三部分第二课:IP地址和域名 上一课我们说了在Web之中,全球各地有无数台机器,有些充当客户机,有些作为服务器. 那么这些机器如何找到和辨认彼此呢?难道不会"只是因为在人群中多看了你一眼,再也没能想起你容颜"吗? 如果我用我的浏览器上网,我怎么知道哪个服务器向我发送此网站呢? 为了解决这个难题,IT科学家们使用了一个叫做IP地址的东西(东西好像有点太难听了,IP它根本就不是个东西好嘛). IP是Interne

SSL 中证书是否可以使用IP而不是域名

前言:以前听别人说生成证书时可以用IP地址,今天用例子证实了下用IP地址是不行的. 情景一: 生成证书时指定的名称为IP地址 例子是做单点登录时的例子,web.xml中配置如下: <!--该过滤器负责用户的认证工作,必须启用它 --> <filter> <filter-name>CASFilter</filter-name> <filter-class>org.jasig.cas.client.authentication.Authenticat

nginx禁止IP只允许域名访问

upstream jenkins{ server 127.0.0.1:8080; } server { listen 80 default; #配置此段表示用IP或其他域名访问时跳转到www.baidu.com server_name _; rewrite ^ http://www.baidu.com$request_uri?; } server { listen 80; server_name www.twjenkins.com; #写多一个server配置自定义的域名 location /

ip地址、域名、DNS、URL的区别与联系

IP:每个连接到Internet上的主机都会分配一个IP地址,此ip是该计算机在互联网上的逻辑地址的唯一标识,计算机之间的访问就是通过IP地址来进行的.写法:十进制的形式,用“.”分开,叫做“点分十进制表示法”,如:127.0.0.1.IP地址采用二进制的形式表示的话很长,比较麻烦,为了便于使用,IP地址经常被写成十进制的形式. 域名:ip是数字标识,使用时不好记忆和书写,因此在将IP地址符号化,每一个符号化的地址都与特定的IP地址对应.用字符型地址代替数字型的IP地址,这个字符型地址就被称为域

nginx+tomcat实现单IP,多域名,多站点的访问

其实这个问题分为两个子问题来解决: 1.如何实现单IP多tomcat站点 2.对于多域名的多个站点如何通过nginx分发访问 问题一:解决方案又分为两种: a.单实例tomcat配置多个host站点 这种方法有一个缺点就是无法分站点调试,如果一个站点出了问题,关服务进行调试会停掉所有站点(不过这个方案就不会涉及到第二个问题,因为这样单实例无法实现多个站点对应多个顶级域名)b.多实例tomcat配置实现单机多站点 这个方法很简单,就相当于把tomcat拷贝多份,然后修改各个tomcat的serve

IP地址与域名的关系

1.IP地址:IP地址是用来唯一标识互联网上计算机的逻辑地址,让电脑之间可以相互通信. 每台连网计算机都依靠IP地址来互相区分.相互联系 2.域名:由于IP地址是数字标识,使用时难以记忆和书写,因此在IP地址的基础上又发展出一种符号化的地址方案,来代替数字型的IP地址.每一个符号化的地址都与特定的IP地址对应,这样网络上的资源访问起来就容易得多了.这个与网络上的数字型IP地址相对应的字符型地址,就被称为域名. 3.DNS:在Internet上域名与IP地址之间是一对一(或者多对一)的,域名虽然便

apache2.4 只允许合法域名访问网站 禁止使用ip、非法域名访问

1.ip访问禁用ip访问 只能对应端口有效<VirtualHost *:80> ServerName xx.xx.xx.xx ServerAlias * <Location /> Order Allow,Deny Deny from all </Location></VirtualHost><VirtualHost *:8511> ServerName xx.xx.xx.xx ServerAlias * <Location /> Or