Java网络编程从入门到精通(2):创建InetAddress对象的四个静态方法

简介:
InetAddress 类是 Java 中用于描述 IP 地址的类。它在 java.net 包中。在 Java 中分别用 Inet4Address Inet6Address 类来描述 IPv4 IPv6 的地址。这两个类都是 InetAddress 的子类。由于 InetAddress 没有 public 的构造方法,因此,要想创建 InetAddress 对象,必须得依靠它的四个静态方法。 InetAddress 可以通过 getLocalHost 方法得到本机的 InetAddress 对象,也可以通过 getByName getAllByName getByAddress 得到远程主机的 InetAddress 对象。
一、 getLocalHost 方法
使用getLocalHost 可以得到描述本机IP InetAddress 对象。这个方法的定义如下:
public   static  InetAddress getLocalHost()  throws  UnknownHostException
这个方法抛出了一个UnknownHostException 异常,因此,必须在调用这个方法的程序中捕捉或抛出这个异常。下面的代码演示了如何使用getLocalHost 来得到本机的IP 和计算机名。
package  inet;

import  java.net. * ;

public   class  MyInetAddress1
{
    
public   static   void  main(String[] args)  throws  Exception
    {
        InetAddress localAddress 
=  InetAddress.getLocalHost();
        System.out.println(localAddress);        
    }
}
运行结果:
ComputerName / 192.168 . 18.10
InetAddress 类中覆盖了Object 类的toString 方法,实现如下:
public  String toString() 
{
     return  ((hostName  !=   null ?  hostName :  "" +   " / "   +  getHostAddress();
}
从上面的代码可以看出,InetAddress 方法中的toString 方法返回了用“/“ 隔开的主机名和IP 地址。因此,在上面的代码 直接通过localAddress 对象来输出本机计算机名和IP 地址(将对象参数传入println 方法后,println 方法会调用对象参数的toString 方法来输出结果)。
当本机绑定了多个IP 时,getLocalHost 只返回第一个IP 。如果想返回本机全部的IP ,可以使用getAllByName 方法。
二、 getByName 方法
这个方法是InetAddress 类最常用的方法。它可以通过指定域名从DNS 中得到相应的IP 地址。getByName 一个String 类型参数,可以通过这个参数指定远程主机的域名,它的定义如下:
public   static  InetAddress getByName(String host)  throws  UnknownHostException
如果host 所指的域名对应多个IP getByName 返回第一个IP 。如果本机名已知,可以使用getByName 方法来代替getLocalHost 。当host 的值是localhost 时,返回的IP 一般是127.0.0.1 。如果host 是不存在的域名,getByName 将抛出UnknownHostException 异常,如果host IP 地址,无论这个IP 地址是否存在,getByName 方法都会返回这个IP 地址(因此getByName 并不验证IP 地址的正确性)。下面代码 演示了如何使用getByName 方法:
   package  inet;
  
  
import  java.net. * ;
  
  
public   class   MyInetAddress2
  {
      
public   static   void  main(String[] args)  throws  Exception
      {
          
if  (args.length  ==   0 )
              
return ;
          String host 
=  args[ 0 ];
          InetAddress address 
=  InetAddress.getByName(host);
          System.out.println(address);
      }
  }
  •  测试1:远程主机www.csdn.net
执行如下命令:
java  inet .MyInetAddress2 www.csdn.net
运行结果:
www.csdn.net / 211.100 . 26.124
  • 测试2:本机名ComputerName
执行如下命令:

java  inet .MyInetAddress2  ComputerName
运行结果:
ComputerName / 192.168 . 18.10
  • 测试3:代表本机的localhost
执行如下命令:
java  inet .MyInetAddress2  localhost
运行结果:
localhost / 127.0 . 0.1
对于本机来说,除了可以使用本机名或localhost 外,还可以在hosts 文件中对本机做“IP/ 域名映射(在Windows 操作系统下)。这个文件在C:\WINDOWS\system32\drivers\etc 中。打开这两个文件中,在最后加一行如下所示的字符串:
192.168 . 18.100    www.mysite.com
  • 测试4:本机域名www.mysite.com
执行如下命令:

java  inet .MyInetAddress2  www.mysite.com
运行结果:
www.mysite.com / 192.168 . 18.100
getByName 方法除了可以使用域名作为参数外,也可以直接使用IP 地址作为参数。如果使用IP 地址作为参数,输出InetAddress 对象时域名为空(除非调用getHostName 方法后,再输出InetAddress 对象。getHostName 方法将在 下面的内容介绍)。读者可以使用129.42.58.212 作为 MyInetAddress2 的命令行参数(这是www.ibm.com IP ),看看会得到什么结果。
三、 getAllByName 方法
使用getAllByName 方法可以从DNS 上得到域名对应的所有的IP 。这个方法返回一个InetAddress 类型的数组。这个方法的定义如下:
    public   static  InetAddress[] getAllByName(String host)  throws  UnknownHostException
    getByName 方法一样,当host 不存在时,getAllByName 也会抛出UnknowHostException 异常,getAllByName 也不会验证IP 地址是否存在。下面的代码 演示了getAllByName 的用法:
   package  inet;
  
  
import  java.net. * ;
  
  
public   class   MyInetAddress3
  {
      
public   static   void  main(String[] args)  throws  Exception
      {
          
if  (args.length  ==   0 )
              
return ;
          String host 
=  args[ 0 ];
          InetAddress addresses[] 
=  InetAddress.getAllByName(host);
          
for  (InetAddress address : addresses)
              System.out.println(address);
      }
  }
  • 测试1:远程主机www.csdn.net
执行如下命令:
java  inet . MyInetAddress3  www.csdn.net
运行结果:
www.csdn.net / 211.100 . 26.124
www.csdn.net
/ 211.100 . 26.121
www.csdn.net
/ 211.100 . 26.122
www.csdn.net
/ 211.100 . 26.123
将上面的运行结果和例程3-2 的测试1 的运行结果进行比较,可以得出一个结论,getByName 方法返回的IP 地址就是getAllByName 方法返回的第一个IP 地址。事实上,getByName 的确是这样实现的,getByName 的实现代码如下:

public   static  InetAddress getByName(String host)  throws  UnknownHostException
{
     return  InetAddress.getAllByName(host)[ 0 ];
}
  •  测试2:使用www.csdn.net的一个IP 
执行如下命令:
java  inet . MyInetAddress3   211.100 . 26.122
运行结果:
/ 211.100 . 26.122
四、 getByAddress 方法
这个方法必须通过IP 地址来创建InetAddress 对象,而且IP 地址必须是byte 数组形式。getByAddress 方法有两个重载形式,定义如下:
public   static  InetAddress getByAddress( byte [] addr)  throws  UnknownHostException
public   static  InetAddress getByAddress(String host,  byte [] addr)  throws  UnknownHostException
第一个重载形式只需要传递byte 数组形式的IP 地址,getByAddress 方法并不验证这个IP 地址是否存在,只是简单地创建一个InetAddress 对象。addr 数组的长度必须是4 IPv4 )或16 IPv6 ),如果是其他长度的byte 数组,getByAddress 将抛出一个UnknownHostException 异常。第二个重载形式多了一个host ,这个host getByName getAllByName 方法中的host 的意义不同,getByAddress 方法并不使用host DNS 上查找IP 地址,这个host 只是一个用于表示addr 的别名。下面的代码 演示了getByAddress 的两个重载形式的用法:

   package   inet ;
  
  
import  java.net. * ;
  
  
public   class   MyInetAddress4
  {
      
public   static   void  main(String[] args)  throws  Exception
      {
          
byte  ip[]  =   new   byte [] { ( byte 141 , ( byte 146 8  ,  66 };
          InetAddress address1 
=  InetAddress.getByAddress(ip);
          InetAddress address2 
=  InetAddress.getByAddress( " Oracle官方网站 " , ip);
          System.out.println(address1);
          System.out.println(address2);
      }
  }
上面代码 的运行结果如下:
/ 141.146 . 8.66
Oracle官方网站
/ 141.146 . 8.66
     从上面的运行结果可以看出,getByAddress 只是简单地将host 参数作为域名放到“/” 前面,因此,host 可以是任何字符串。



 本文转自 androidguy 51CTO博客,原文链接:http://blog.51cto.com/androidguy/214818,如需转载请自行联系原作者

相关实践学习
基于函数计算快速搭建Hexo博客系统
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
相关文章
|
1天前
|
Java
Java基础之对象的引用
Java基础之对象的引用
5 0
|
4天前
|
监控 Java 开发者
深入理解 Java 网络编程和 NIO
【4月更文挑战第19天】Java网络编程基于Socket,但NIO(非阻塞I/O)提升了效率和性能。NIO特点是非阻塞模式、选择器机制和缓冲区,适合高并发场景。使用NIO涉及通道、选择器和事件处理,优点是高并发、资源利用率和可扩展性,但复杂度、错误处理和性能调优是挑战。开发者应根据需求选择是否使用NIO,并深入理解其原理。
|
5天前
|
Java
Java中如何克隆一个对象?
【4月更文挑战第13天】
14 0
|
6天前
|
网络协议 Java API
深度剖析:Java网络编程中的TCP/IP与HTTP协议实践
【4月更文挑战第17天】Java网络编程重在TCP/IP和HTTP协议的应用。TCP提供可靠数据传输,通过Socket和ServerSocket实现;HTTP用于Web服务,常借助HttpURLConnection或Apache HttpClient。两者结合,构成网络服务基础。Java有多种高级API和框架(如Netty、Spring Boot)简化开发,助力高效、高并发的网络通信。
|
6天前
|
Java API 数据库
深入解析:使用JPA进行Java对象关系映射的实践与应用
【4月更文挑战第17天】Java Persistence API (JPA) 是Java EE中的ORM规范,简化数据库操作,让开发者以面向对象方式处理数据,提高效率和代码可读性。它定义了Java对象与数据库表的映射,通过@Entity等注解标记实体类,如User类映射到users表。JPA提供持久化上下文和EntityManager,管理对象生命周期,支持Criteria API和JPQL进行数据库查询。同时,JPA包含事务管理功能,保证数据一致性。使用JPA能降低开发复杂性,但需根据项目需求灵活应用,结合框架如Spring Data JPA,进一步提升开发便捷性。
|
8天前
|
JavaScript Java 测试技术
基于Java的网络游戏交易系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的网络游戏交易系统的设计与实现(源码+lw+部署文档+讲解等)
23 0
|
8天前
|
SQL 安全 Java
Java安全编程:防范网络攻击与漏洞
【4月更文挑战第15天】本文强调了Java安全编程的重要性,包括提高系统安全性、降低维护成本和提升用户体验。针对网络攻击和漏洞,提出了防范措施:使用PreparedStatement防SQL注入,过滤和转义用户输入抵御XSS攻击,添加令牌对抗CSRF,限制文件上传类型和大小以防止恶意文件,避免原生序列化并确保数据完整性。及时更新和修复漏洞是关键。程序员应遵循安全编程规范,保障系统安全。
|
1月前
|
网络协议 算法 Java
|
3月前
|
Java 数据格式
最新Java基础系列课程--Day15-网络编程(三)
最新Java基础系列课程--Day15-网络编程
|
3月前
|
存储 网络协议 Java
最新Java基础系列课程--Day15-网络编程(二)
最新Java基础系列课程--Day15-网络编程

热门文章

最新文章