Android开发之InetAddress基础入门简介与源码实例

 更新时间:2020年03月19日 16:07:51   作者:姚镜堂  
这篇文章主要介绍了Android开发之InetAddress基础入门简介,需要的朋友可以参考下

最近在学习soket编程中,看到有需要获取到IP地址之类的需求,所以就去看了下如何获取到主机名的IP地址。

其实就是需要用到一个类InetAddress。他是在java.net包下面。

InetAddress类的对象用于IP地址和域名,该类提供以下方法:

getByName(String s):获得一个InetAddress 类的对象,该对象中含有主机的IP地址和域名,该对象用如下格式表示它包含的信息:www.sina.com.cn/202.108.37.40;

String getHostName():获取InetAddress对象的域名;

String getHostAddress():获取InetAddress对象的IP地址;

getLocalHost():获得一个InetAddress对象,该对象含有本地机的域名和IP地址。

private void test() {
    try {
      InetAddress locAdd = InetAddress.getLocalHost(); //得到本地InetAddress对象
      /* get www.baidu.com's ip */
      InetAddress remAdd = InetAddress.getByName("www.baidu.com"); //取得远程InetAddress对象
      System.out.println("本机IP地址:" + locAdd.getHostAddress()); //得到本地IP地址
      System.out.println("百度IP地址:" + remAdd.getHostAddress()); //得到百度IP地址
      System.out.println("本机是否可达:" + locAdd.isReachable(10000)); //10000是超时时间,10s
      /*
        打印:
        本机IP地址:192.168.1.109
        百度IP地址:115.239.210.26
        本机是否可达:true
      */
    } catch (UnknownHostException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

很多情况是,某一域名对应的主机IP是可能有多个的,我们也可以一一的取回来。如下:

private void test2() {
    try {
      /* 百度可能有多个IP地址,解析回来,所以我们可以用一个数组装起来 */
      InetAddress[] addrs = InetAddress.getAllByName("www.baidu.com");
      if (addrs != null && addrs.length > 0) {
        for (InetAddress addr : addrs) {
          System.out.println("--->" + addr.getHostAddress());
        }
      }
    } catch (UnknownHostException e) {
      e.printStackTrace();
    }
  }

IP地址是IP使用的32位(IPv4)或者128位(IPv6)位无符号数字,它是传输层协议TCP,UDP的基础。InetAddress是Java对IP地址的封装,在java.net中有许多类都使用到了InetAddress,包括ServerSocket,Socket,DatagramSocket等等。

InetAddress的实例对象包含以数字形式保存的IP地址,同时还可能包含主机名(如果使用主机名来获取InetAddress的实例,或者使用数字来构造,并且启用了反向主机名解析的功能)。InetAddress类提供了将主机名解析为IP地址(或反之)的方法。

InetAddress对域名进行解析是使用本地机器配置或者网络命名服务(如域名系统(Domain Name System,DNS)和网络信息服务(Network Information Service,NIS))来实现。

对于DNS来说,本地需要向DNS服务器发送查询的请求,然后服务器根据一系列的操作,返回对应的IP地址,为了提高效率,通常本地会缓存一些主机名与IP地址的映射,这样访问相同的地址,就不需要重复发送DNS请求了。

在java.net.InetAddress类同样采用了这种策略。在默认情况下,会缓存一段有限时间的映射,对于主机名解析不成功的结果,会缓存非常短的时间(10秒)来提高性能。

InetAddress类

该类代表ip地址,下面还有两个子类,分别是Inet4Address和Inet6Address他们分别代表IPV4地址和IPV6地址

该类没有构造器,可以通过它的两个静态方法来获取InetAddress的实例

>getByName(String host) 根据主机名获取对应的InetAddress对象

使用IP地址创建InetAddress对象(getByName,getAllByName,getByAddress方法都可以通过IP地址创建InetAddress对象)时,并不需要访问DNS服务器。因此,通过DNS服务器查找域名的工作就由getHostName方法来完成。

如果IP地址不存在或DNS服务器不允许进行IP地址和域名映射,就返回这个IP地址。

InetAddress address=InetAddress.getByName("141.146.8.66");

System.out.println(address.getHostName());//需要访问DNS服务器才能得到域名

InetAddress address=InetAddress.getByName("1.2.3.4");//IP地址不存在

System.out.println(address.getHostName());//直接返回IP地址

用域名作为getByName和getAllByName方法的参数得到的InetAddress对象,该对象会得到这个域名,当调用 getHostName时,就无需再访问DNS服务器,而是直接将这个域名返回。

InetAddress address=InetAddress.getByName("www.jb51.net");

System.out.println(address.getHostName());//不需要访问DNS服务器就能得到域名

try {
	InetAddress address = InetAddress.getByName("www.jb51.net");
	System.out.println(address);//www.jb51.net/119.75.218.70
} catch (UnknownHostException e) {
	e.printStackTrace();
}

>getByAddress(byte[] addr)根据源ip地址来获取InetAddress对象

InetAddress address;
try {
	address= InetAddress.getByAddress(new byte[]{119,75,218,70});
	System.out.println(address);//输出结果为:/119.75.218.70和字符串str相一致
	address = InetAddress.getByAddress("www.jb51.net", ipBuf);
	System.out.println(address);//输出结果为www.jb51.net/119.75.218.70
} catch (UnknownHostException e) {
	e.printStackTrace();
}

>InetAddress.getLocalHost()获取本机的ip地址的主机名

try {
	InetAddress a = InetAddress.getLocalHost();
	System.out.println(a);//本机用户名-PC/本机Ip
} catch (UnknownHostException e) {
	e.printStackTrace();
}

该类常用的其他几个方法:

try {
	InetAddress address=InetAddress.getLocalHost();
	System.out.println(address.getHostAddress());//输出ip字符串
	System.out.println(address.getHostName());//输出用户名
	System.out.println(address.getCanonicalHostName());//输出本机的主机名.权限定域名(lan)
} catch (UnknownHostException e) {			
	e.printStackTrace();		
}

getCanonicalHostName()方法

定义:public String getCanonicalHostName()

该方法和getHostName方法一样,也是得到远程主机的域名。区别是,该方法得到的是主机名,getHostName得到的是主机别名。

1. 使用 getLocalHost() 创建InetAddress对象

此时getCanonicalHostName方法和getHostName方法得到的都是本机名

2. 使用域名 创建InetAddress对象

使用域名创建InetAddress对象后,getHostName方法不会访问DNS服务器

但getCanonicalHostName方法就不一定了,这取决于DNS服务器如何解释主机名和主机别名

3. 使用IP地址 创建InetAddress对象

此时getCanonicalHostName方法和getHostName方法完全相同,返回的都是主机名,而不是主机别名。

之所以要使用主机别名,是因为有时主机名可能比较复杂,如Oracle官方网站的主机名bigip-otn-portal.oracle.com,因此,为了使用户访问网站更方便,就增加了更简单的主机别名,如 www.oracle.com

本文主要介绍了Android InetAddress基础入门简介与源码实例,更多关于Android开发技巧请查看下面的相关链接

相关文章

  • Android6.0 屏幕固定功能详解

    Android6.0 屏幕固定功能详解

    android6.0在设置->安全->屏幕固定开启后,然后再长按home键出现最近的几个Activity可以选择一个图钉按钮就开启了屏幕固定功能。这篇文章主要介绍了Android6.0 屏幕固定功能的相关资料,感兴趣的朋友一起看看吧
    2016-09-09
  • Android权限机制带来的一些安全问题介绍

    Android权限机制带来的一些安全问题介绍

    这篇文章主要介绍了Android权限机制带来的一些安全问题介绍,本文讲解了权限机制的缺陷和不足、树立权限意识、越过权限机制等内容,需要的朋友可以参考下
    2015-04-04
  • Android RecycleView实现Item拖拽效果

    Android RecycleView实现Item拖拽效果

    RecyclerView是Android一个更强大的控件,其不仅可以实现和ListView同样的效果,还有优化了ListView中的各种不足。本文将介绍通过RecyclerView实现Item拖拽效果以及拖拽位置保存,感兴趣的可以参考一下
    2022-01-01
  • Android使用 Spinner控件实现下拉框功能

    Android使用 Spinner控件实现下拉框功能

    Spinner是android的一种控件,用它我们可以实现下拉框。下面通过实例代码给大家介绍Android使用 Spinner控件实现下拉框功能,感兴趣的朋友一起看看吧
    2018-08-08
  • android自定义环形对比图效果

    android自定义环形对比图效果

    这篇文章主要为大家详细介绍了android自定义环形对比图,外环有类似进度条的旋转动画,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • python gstreamer实现视频快进/快退/循环播放功能

    python gstreamer实现视频快进/快退/循环播放功能

    这篇文章主要介绍了python gstreamer 实现视频快进/快退/循环播放功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • 基于Android实现转盘按钮代码

    基于Android实现转盘按钮代码

    这篇文章主要介绍了基于Android实现转盘按钮代码的相关资料,需要的朋友可以参考下
    2015-12-12
  • Android中捕获TTextView文本中的链接点击事件方法

    Android中捕获TTextView文本中的链接点击事件方法

    这篇文章主要介绍了Android中捕获TTextView文本中的链接点击事件方法,本文给出了实现代码和使用方法以及实现自己控制的方法,需要的朋友可以参考下
    2015-01-01
  • 如何在Android App中接入微信支付

    如何在Android App中接入微信支付

    这篇文章主要介绍了如何在Android App中接入微信支付,帮助大家更好的理解和学习使用Android开发,感兴趣的朋友可以了解下
    2021-03-03
  • Android ListView与RecycleView的对比使用解析

    Android ListView与RecycleView的对比使用解析

    这篇文章主要介绍了Android ListView与RecycleView的对比使用解析,需要的朋友可以参考下
    2017-12-12

最新评论