Java的两个类 InetAddress类 和 URL 类

Java的两个类 InetAddress类  和  URL  类

下面提供了两个类的常用方法,供大家了解,同时还会根据每个类中方法进行简要说明


1、InetAddress类

 IntAddress 类用于标识网络上的硬件资源,标识互联网协议(IP)地址。

InetAddress类的使用

public static void main(String[] arg) throws UnknownHostException {
    //InetAddress
    InetAddress address = InetAddress.getLocalHost();
    System.out.println("计算机名: "+address.getHostName());
    System.out.println( "Ip地址: " +address.getHostAddress());
    byte[] bytes = address.getAddress();
    System.out.println( "获取字节数组形式的ip地址: " + Arrays.toString(bytes));
    System.out.println(address);

    //根据机器名获取InetAddress
    InetAddress address2 = InetAddress.getByName("192.168.1.230");
    System.out.println("计算机名: "+address2.getHostName());
    System.out.println( "Ip地址: " +address2.getHostAddress());
    byte[] bytes2 = address.getAddress();
    System.out.println( "获取字节数组形式的ip地址: " + Arrays.toString(bytes2));
}

输出信息:

计算机名: DESKTOP-QHSBUG8
Ip地址: 192.168.2.203
获取字节数组形式的ip地址: [-64, -88, 2, -53]
DESKTOP-QHSBUG8/192.168.2.203
计算机名: 192.168.1.230
Ip地址: 192.168.1.230

获取字节数组形式的ip地址: [-64, -88, 2, -53]


1、URL类

public static void main(String[] arg) throws UnknownHostException {

    //URL
    try {
        /**
         * url常用方法
         */
        URL imooc = new URL("http://www.imooc.com");
        URL url = new URL(imooc,"/index.html?username=tom#test");//?为参数 #标识锚点
        System.out.println("协议:" +url.getProtocol());
        System.out.println("主机:"+ url.getHost());
        //如果未指定端口号,则使用默认端口号,此时getPort方法返回值为-1
        System.out.println("端口号:"+url.getPort());
        System.out.println("文件路径:"+url.getPath());
        System.out.println("文件名:"+url.getFile());
        System.out.println("相对路径:" + url.getRef());
        System.out.println("查询字符串:"+url.getQuery());

        /**
         * 通过url来读取网页内容
         */
        //创建url实例
        URL url1= new URL("http://www.baidu.com");
            //通过URL的openStream 方法获得URL对象所表示的资源字节输入流
            InputStream is = url1.openStream();
            //将字节输入流转换为字符输入流
            InputStreamReader isr =new  InputStreamReader(is,"gbk");
            //为字符输入流添加缓冲
            BufferedReader br = new BufferedReader(isr);
            String data  = br.readLine();//读取数据
            while(data != null){
                System.out.println(data);
                data = br.readLine();
            }
            br.close();
            isr.close();
            is.close();
     
    } catch (Exception e) {
        e.printStackTrace();
    }

}

输出信息:

协议:http
主机:www.imooc.com
端口号:-1
文件路径:/index.html
文件名:/index.html?username=tom
相对路径:test

查询字符串:username=tom



两个类详解:

1. java.net.InetAddress类的使用


1.1. 简介(参考其他博客,点击跳入

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秒)来提高性能。

1.2. InetAddress对象的获取

InetAddress的构造函数不是公开的(public),所以需要通过它提供的静态方法来获取,有以下的方法:

复制代码
static InetAddress[] getAllByName(String host)

static InetAddress getByAddress(byte[] addr)

static InetAddress getByAddress(String host,byte[] addr)

static InetAddress getByName(String host)

static InetAddress getLocalHost()
复制代码

在这些静态方法中,最为常用的应该是getByName(String host)方法,只需要传入目标主机的名字,InetAddress会尝试做连接DNS服务器,并且获取IP地址的操作。代码片段如下,注意我们假设以下的代码,都是默认导入了java.net中的包,在程序的开头加上import java.net.*,否则需要指定类的全名java.net.InetAddress。

InetAddress address=InetAddress.getByName("www.baidu.com");

注意到这些方法可能会抛出的异常。如果安全管理器不允许访问DNS服务器或禁止网络连接,SecurityException会抛出,如果找不到对应主机的IP地址,或者发生其他网络I/O错误,这些方法会抛出UnknowHostException。

一、getHostName() 方法

    定义:public String getHostName()

    根据创建InetAddress对象的不同方式,getHostName的返回值是不同的。

 1. 用 getLocalHost() 方法创建的InetAddress的对象

        此时getHostName返回的是本机名

        InetAddress address=InetAddress.getLocalHost();

        System.out.println(address.getHostName());//返回本机名

   2. 用域名创建 InetAddress对象

        用域名作为getByName和getAllByName方法的参数得到的InetAddress对象,该对象会得到这个域名,当调用

        getHostName时,就无需再访问DNS服务器,而是直接将这个域名返回

1 InetAddress address=InetAddress.getByName("ZZQ");  
2 System.out.println(address.getHostName());//不必再访问DNS服务器,直接返回域名 

  3. 用IP地址 创建InetAddress对象

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

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

1 InetAddress address=InetAddress.getByName("141.146.8.66");  
2 System.out.println(address.getHostName());//需要访问DNS服务器才能得到域名  
3 InetAddress address=InetAddress.getByName("1.2.3.4");//IP地址不存在  
4 System.out.println(address.getHostName());//直接返回IP地址  

二、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

三、getHostAddress()方法

    定义:public String getHostAddress()

    该方法用来得到主机的IP地址,这个IP地址可以是IPv4也可以是IPv6的

    无论InetAddress对象是用哪种方式创建,getHostAddress方法都不会访问DNS服务器。

复制代码
 1 public static void getHostAddressTest() throws UnknownHostException {  
 2         // 输出IPv4地址  
 3         InetAddress ipv4Address1 = InetAddress.getByName("1.2.3.4");  
 4         System.out.println("ipv4Address1:" + ipv4Address1.getHostAddress());  
 5         //ipv4Address1:1.2.3.4  
 6         InetAddress ipv4Address2 = InetAddress.getByName("www.ibm.com");  
 7         System.out.println("ipv4Address2:" + ipv4Address2.getHostAddress());  
 8         //ipv4Address2:129.42.60.216  
 9         InetAddress ipv4Address3 = InetAddress.getByName("ZZQ");  
10         System.out.println("ipv4Address3:" + ipv4Address3.getHostAddress());  
11         //ipv4Address3:192.168.1.105  
12         // 输出IPv6地址  
13         InetAddress ipv6Address1 = InetAddress.getByName("abcd:123::22ff");  
14         System.out.println("ipv6Address1:" + ipv6Address1.getHostAddress());  
15         //ipv6Address1:abcd:123:0:0:0:0:0:22ff  
16         InetAddress ipv6Address2 = InetAddress.getByName("www.neu6.edu.cn");  
17         System.out.println("ipv6Address2:" + ipv6Address2.getHostAddress());  
18         //ipv6Address2:2001:da8:9000:b255:210:5cff:fef5:ac49  
19         // 输出本机全部的IP地址  
20         InetAddress Addresses[] = InetAddress.getAllByName("ZZQ");  
21         for (InetAddress address : Addresses)  
22             System.out.println("本机地址:" + address.getHostAddress());  
23         //本机地址:192.168.1.105  
24         //本机地址:0.1.0.4  
25         //本机地址:0:0:0:0:0:0:0:1  
26     }  
复制代码

四、getAddress()方法

    定义:public byte[] getAddress()

    该方法和getHostAddress方法唯一区别是,getHostAddress返回字符形式的IP地址,getAddress返回byte数组形式的IP地址。

复制代码
 1 public static void getAddressTest() throws UnknownHostException {  
 2         InetAddress address = InetAddress.getByName("www.csdn.net");  
 3         byte ip[] = address.getAddress();  
 4         for (byte ipSegment : ip)  
 5             System.out.print(ipSegment + ".");  
 6         System.out.println("");  
 7         //-53.81.21.61  
 8         /*  
 9          * byte数组是有符号的。在Java中byte类型的取值范围是-128~127. 
10          * 如果返回的IP地址的某个字节是大于127的整数,在byte数组中就是负数。 
11          * 由于Java中没有无符号byte类型,因此,要想显示正常的IP地址,必须使用int或long类型。 
12          */  
13         for (byte ipSegment : ip) {  
14             int newIPSegment = (ipSegment < 0) ? 256 + ipSegment : ipSegment;  
15             System.out.print(newIPSegment + ".");  
16         }  
17         //203.81.21.61  
18     }  
复制代码

2. java.net.URL类的使用

2.1 简介

统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它

2.2 URL对象获取

public URL(String protocol, String host, int port, String file)
public URL(String protocol, String host, String file)
public URL(String protocol, String host, int port, String file,URLStreamHandler handler) 
public URL(String spec) 
public URL(URL context, String spec)
public URL(URL context, String spec, URLStreamHandler handler)

2.3常用方法

    2.3.1    getPath() 

            定义:public String getPath()

            该方法返回 URL 路径部分

    2.3.2    getQuery() 

            定义:public String getQuery()

            该方法返回 URL 查询部分

    2.3.3    getAuthority() 

            定义:public String getAuthority()

            该方法返回 URL 授权部分

    2.3.4    getPort() 

            定义:public int getPort()

            该方法返回 URL 端口部分

    2.3.5    getDefaultPort() 

            定义:public int getDefaultPort()

            返回协议的默认端口

    2.3.6    getProtocol() 

            定义:public String getProtocol()

            该方法返回 URL 协议

    2.3.7    getHost() 

            定义:public String getHost()

            该方法返回 URL 主机

    2.3.8    getFile() 

            定义:public String getFile()

            该方法返回 URL 文件部分

    2.3.9    getRef() 

            定义:public String getPath()

            该方法返回 URL 的锚点(也称引用)

    2.3.9    openConnection() 

            定义:public URLConnection  openConnection()

            该方法打开一个URL连接,并运行客户端访问资源。

案例:使用 URL 类,回去 URL 的各个参数

   public static void main(String [] args)
   {
      try
      {
         URL url = new URL("http://www.runoob.com/index.html?language=cn#j2se");
         System.out.println("URL 为:" + url.toString());
         System.out.println("协议为:" + url.getProtocol());
         System.out.println("验证信息:" + url.getAuthority());
         System.out.println("文件名及请求参数:" + url.getFile());
         System.out.println("主机名:" + url.getHost());
         System.out.println("路径:" + url.getPath());
         System.out.println("端口:" + url.getPort());
         System.out.println("默认端口:" + url.getDefaultPort());
         System.out.println("请求参数:" + url.getQuery());
         System.out.println("定位位置:" + url.getRef());
      }catch(IOException e)
      {
         e.printStackTrace();
      }
   }





            




猜你喜欢

转载自blog.csdn.net/mark_chao/article/details/80851012