Java网络编程——InetAddress类

目录

1.节点(NODE)

2.Internet地址或IP地址

3.域名系统

2>详细了解InetAddress类

1.创建新的InetAddress对象

程序一: 显示某地址的程序

 程序二:查找本地机器的地址

2.InetAddress的常用方法

1.小DEMO

2.给定地址,找到主机名称

3.找到本地机器的IP地址

3>.InetAddress缓存

4>.地址类型

5>.测试可达性 

6>.Object方法

7>. Inet4Address和Inet6Address


1.节点(NODE)

连接到Internet的设备称为节点。

计算机节点称为主机

2.Internet地址或IP地址

每个节点或者主机都由至少一个唯一的数来标识,称为Internet地址或者IP地址

目前大多数IP地址是4个字节长,被称为IPv4地址

一小部分的IP地址是16字节长,被称为IPv6地址

IPv4和IPv6地址都是字节的有序序列,其实就和数组一样的。

浅浅的了解一下

*~*IPV4地址就是给在因特网上的每一台主机的每一个接口分配一个在全世界范围内是唯一的32比特的标识符。

A:8位网络位,24位主机位组成。0.0.0.0-127.255.255.255. 0-127

B:16位网络位,16位主机位. 128.0.0.0-191.255.255.255

C:24位网络位,8位主机位。192.0.0.0-223.255.255.255
D:组播地址. 224.0.0.0-239.255.255.255.

E:保留地址,还未被使用的. 240.0.0.0-255.255.255.255。

私有地址:
A:10.0.0.0-10.255.255.255
B:172.16.0.0-172.31.255.255
C:192.168.0.0-192.168.255.255
 

*~*IPv6地址有128bit,在这128bit中,前64bit是网络前缀,后64bit是接口标识。在前64bit中,前48bit又是全球可汇总地址。

1.实现IPv6的主机和路由器均称为结点。

2.每个地址占128位。

3. 使用冒号十六进制记法,把每个16位的值用十六进制值来表示,各值之间用冒号间隔。

3.域名系统

域名系统DNS(Domain Name System)是因特网使用的命名系统,用来把便于人们使用的机器名字转换成为IP地址。域名系统其实就是名字系统。

DNS将人们可以记忆的主机名与计算机可以记忆的IP地址关联在一起;

服务器通常至少有一个主机名,客户端往往有一个主机名,但是也可能没有。

2>详细了解InetAddress类

java.net.InetAddress类是Java对IP地址(包括IPv4和IPv6)的高层表示。

大多数其他网络都要用到这个类哦,包括Socket、ServerSocket、URL、DatagramSocket、DatagramPacket 等等哦;

一般情况下,它包括一个主机名和一个IP地址。

1.创建新的InetAddress对象

InetAddress类没有公共构造函数;InetAddress有一些静态工厂方法,可以连接到DNS服务器来解析主机名,【eg:InetAddress.getByName()】

程序一: 显示某地址的程序

package BOOK;
//显示www.oreilly.com地址的程序
import java.net.InetAddress;
import java.net.UnknownHostException;

public class OReillyByName {
    public static void main(String[] args) {
        try {
            InetAddress address = InetAddress.getByName("www.oreilly.com");
            System.out.println(address);
        } catch (UnknownHostException e) {
            System.out.println("Could not find www.oreilly.com");
            
        }
    }
}



//输出:
// www.oreilly.com/104.92.73.9

上面这个程序主要显示了www.oreilly.com地址的程序【为www.oreilly.com创建一个InetAddress对象,包括所有必要的导入和异常处理】

下面我详细讲解一下下面这个方法

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

*~*这个方法会建立与本地DNS服务器的一个连接,来查找名字和数字地址(如果之前查找过这个主机,这个信息可能会在本地缓存;如果这样的话,就不需要再建立网络连接);

如果DNS服务器找不到这个地址,这个方法就会抛出一个UnknowHostException异常,这个呢是IOException的一个子类。

 程序二:查找本地机器的地址

package BOOK;

//查找本地机器的地址

import java.net.InetAddress;
import java.net.UnknownHostException;

public class MyAddress {
    public static void main(String[] args) {
        try {
            InetAddress address = InetAddress.getLocalHost();
            System.out.println(address);
        } catch (UnknownHostException e) {
            System.out.println("Could not find this computer's address!");
        }
    }
}

//输出是:
//shizhanli/192.168.30.151

2.InetAddress的常用方法

 1.public String getHostName()

获得该InetAddress对象的主机名称

2.public  String getCanonicalHostName()

获取此IP地址的全限定域名

3.public bytes[] getHostAddress()

获取该InetAddress对象对应的IP地址字符串

4.public static InetAddress getLocalHost()

获取本机对应的InetAddress对象

5.public static InetAddress getByName(String host)

根据主机获得对应的InetAddress对象,参数host可以是IP地址或域名

6.public static InetAddress[] getAllByName(String host)

根据主机获得对应的InetAddress对象

7.public static InetAddress getByAddress(byte[] addr)

获取addr所封装的IP地址对应的Inet Address对象

8.public boolean isReachable(int timeout)

判断是否可以到达该地址

1.小DEMO

通过一个demo来演示一下这些方法叭

package TEMP.Temp3;

//使用以上方法的小demo

import java.net.InetAddress;
import java.net.UnknownHostException;

public class InetAddressDemo {
    public static void main(String[] args) {
        try{
            //获取自己本机地址信息
            InetAddress localIp=InetAddress.getLocalHost();

            //1获取此IP地址的全限定域名
            System.out.println("1.localIp.getCanonicalHostName()="
                    + localIp.getCanonicalHostName());

            //2获取该InetAddress对象对应的IP地址字符串
            System.out.println("2.localIp.getHostAddress()="
                    + localIp.getHostAddress());

            //3获得该InetAddress对象的主机名称
            System.out.println("3.localIp.getHostName()="
                    + localIp.getHostName());


            System.out.println("4.localIp.toString()="+localIp.toString());

            //5.判断是否可以到达该地址
            System.out.println("5.localIp.isReachable(5000)="
                    + localIp.isReachable(5000));

            System.out.println("====================================");
            System.out.println("====================================");

            //获取指定域名地址的信息([eg]百度)
            InetAddress baiduip = InetAddress.getByName("www.baidu.com");

            //1获取此IP地址的全限定域名
            System.out.println("1.baiduIp.getCanonicalHostName()="
                    + baiduip.getCanonicalHostName());
            //2获取该InetAddress对象对应的IP地址字符串
            System.out.println("2.baiduIp.getHostAddress()="
                    + baiduip.getHostAddress());

            //3获得该InetAddress对象的主机名称
            System.out.println("3.baiduIp.getHostName()="
                    + baiduip.getHostName());

            System.out.println("4.baiduIp.toString()="+baiduip.toString());

            //5判断是否可以到达该地址
            System.out.println("5.baiduIp.isReachable(5000)="
                    + baiduip.isReachable(5000));
            System.out.println("====================================");
            System.out.println("====================================");

            //获取指定原始IP地址信息
            InetAddress ip = InetAddress.getByAddress(new byte[]{127,0,0,1});
            // InetAddress ip = InetAddress.getByName("127.0.0.1");
            System.out.println("1.ip.getCanonicalHostName()=" + ip.getCanonicalHostName());
            System.out.println("2.ip.getHostAddress()= "+ ip.getHostAddress());
            System.out.println("3.ip.getHostName()="+ ip.getHostName());
            System.out.println("4.ip.toString()="+ ip.toString());
            System.out.println("5.ip.isReachable(5000)="
                    + ip.isReachable(5000));
        }catch(UnknownHostException e){
            e.printStackTrace();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

//输出结果
//        1.localIp.getCanonicalHostName()=shizhanli.lan
//        2.localIp.getHostAddress()=192.168.30.151
//        3.localIp.getHostName()=shizhanli
//        4.localIp.toString()=shizhanli/192.168.30.151
//        5.localIp.isReachable(5000)=true
//        ====================================
//        ====================================
//        1.baiduIp.getCanonicalHostName()=14.215.177.38
//        2.baiduIp.getHostAddress()=14.215.177.38
//        3.baiduIp.getHostName()=www.baidu.com
//        4.baiduIp.toString()=www.baidu.com/14.215.177.38
//        5.baiduIp.isReachable(5000)=true
//        ====================================
//        ====================================
//        1.ip.getCanonicalHostName()=localhost
//        2.ip.getHostAddress()= 127.0.0.1
//        3.ip.getHostName()=localhost
//        4.ip.toString()=localhost/127.0.0.1
//        5.ip.isReachable(5000)=true

2.给定地址,找到主机名称

package TEMP.Temp3;

//给定地址,找出主机名
import java.net.InetAddress;
import java.net.UnknownHostException;

public class ReverseTest {
    public static void main(String[] args) throws UnknownHostException {
        InetAddress ia = InetAddress.getByName("192.168.30.151");
        System.out.println(ia.getCanonicalHostName());

    }
}

//输出结果:
//shizhanli.lan

3.找到本地机器的IP地址

package TEMP.Temp3;

//找到本地机器的IP地址

import java.net.InetAddress;
import java.net.UnknownHostException;

public class MyAddress {
    public static void main(String[] args) {
        try{
            InetAddress me = InetAddress.getLocalHost();
            String dottedQuad = me.getHostAddress();//创建一个String类型的变量来接受返回的ip地址
            System.out.println("My address is " + dottedQuad);
        }catch (UnknownHostException ex){
            System.out.println("I'm sorry.I don't know my own address.");

        }
    }
}

//输出:My address is 192.168.30.151

3>.InetAddress缓存

InetAddress类具有高速缓存以存储成功以及不成功的主机名解析。

默认情况下,安装安全管理器时,为了防止DNS欺骗攻击,主机名正确解决方案的结果将永久缓存。 

当没有安装安全管理器时,默认的行为是缓存条目以获得有限的(实现依赖的)时间段。 

不成功的主机名解析的结果被缓存很短的时间(10秒),以提高性能。

如果不需要默认行为,则可以将Java安全属性设置为不同的生存时间(TTL)值进行正缓存。 同样,系统管理员可以在需要时配置不同的缓存缓存TTL值。

4>.地址类型

有些IP地址和地址模式有特殊的含义。Java提供了许多方法来测试InetAddress对象是否符合其中某个标准。

1.public boolean isAnylocalAdress()

如果是通配地址,方法返回true。通配地址可以匹配本地系统中的任何地址,在IPv4中,通配地址是0.0.0.0。在IPv6中,通配地址是0:0:0:0:0:0:0:0。

2.public boolean isLoopbackAdress()

如果是回送地址,方法返回true。回送地址直接在IP层连接同一台计算机,而不使用任务物理硬件。在IPv4中,这个地址是127.0.0.1。在IPv6中,这个回送地址是0:0:0:0:0:0:0:1。

3.public boolean isLinkLocalAddress()

如果地址是一个IPv6本地链接地址,方法返回true,否则返回false。
4.public boolean isSiteLocalAddress()

如果地址是一个IPv6本地网络地址,方法返回true,否则返回false。
5.public boolean isMulticastAddress()

如果地址是一个组播地址,方法返回true,否则返回false。
6.public boolean isMCGlobal()

如果地址是全球组播地址,方法返回true,否则返回false。
7.public boolean isMCNodeLocal()

如果地址是一个本地接口组播地址,方法返回true,否则返回false。
8.public boolean isMCLinkLocal()

如果地址是一个子网范围组播地址,方法返回true,否则返回false。
9.public boolean isMCSiteLocal()

如果地址是一个网站范围组播地址,方法返回true,否则返回false。
10.public boolean isMCOrgLocal()
 如果地址是一个组织范围组播地址,方法返回true,否则返回false。

5>.测试可达性 

InetAddress类有两个isReachable()方法,可以测试一个特定节点对当前主机是否可达哦。

方法①public boolean isReachable(int timeout) throws IOException
方法②public boolean isReachable(NetworkInterface interface, int ttl, int timeout) throws IOException

小小解析:

这些方法尝试使用traceroute查看指定地址是否可达。如果主机在timeout毫秒内响应,则方法返回true;否则返回false。如果出现网络错误则抛出IOException异常。第二个方法还允许指定从哪个本地网络接口建立连接,以及“生存时间”。

 6>.Object方法

1.public boolean equals(Object o)

若与一个InetAddress对象有相同的IP地址,并不要求这两个对象有相同的主机名,就返回true,否则返回false。
2.public int hasCode()

只根据IP地址来计算,不考虑主机名
3.public String toString()

生成的字符串有两种格式:主机名或点分四段地址。

7>. Inet4Address和Inet6Address

Java使用了两个类Inet4Address和Inet6Address,来区分IPv4地址和IPv6地址.

1.public final class Inet4Address extends InetAddress
2.public final class Inet6Address extends InetAddress

你可能感兴趣的:(笔记,大数据,网络,java)