IP和java.net.InetAddress类的使用
一、IP
1、地址格式
互联网上每一台计算机都有一个唯一标示自己的标记,这个标记就是IP地址。IP 地址使用32 位长度二进制数据标示,一般在实际中看到的大部分IP地址都是以十进制的数据形式标示的,如:192.168.1.3,IP地址格式如下:
IP 地址 = 网络地址 + 主机地址
网络号:用于识别主机所在的网络
主机号:用于识别网络中的主机
2、地址分类
IP地址按照数字区域,分为5类,如下所示:
A 类:政府机构
B 类:中等规模的公司
C 类:任何需要的人
D 类:用于组播
E 类:用于实验
二、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地址的操作。
InetAddress address=InetAddress.getByName("www.baidu.com");
注意到这些方法可能会抛出的异常。如果安全管理器不允许访问DNS服务器或禁止网络连接,会抛出SecurityException,如果找不到对应主机的IP地址,或者发生其他网络I/O错误,这些方法会抛出UnknowHostException。
1.3 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地址
1.4 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
1.5 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 }
1.6 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 }
IP和java.net.InetAddress类的使用的更多相关文章
- java中Inetaddress类
InetAddress类 InetAddress类用来封装我们前面讨论的数字式的IP地址和该地址的域名. 你通过一个IP主机名与这个类发生作用,IP主机名比它的IP地址用起来更简便更容易理解. Ine ...
- Java学习---InetAddress类的学习
基础知识 1.InetAddress类 在网络API套接字,InetAddress类和它的子类型对象使用域名DNS系统,处理主机名到主机IPv4或IPv6地址的转换.如图1-1所示. 由于InetAd ...
- Android(java)学习笔记79:java中InetAddress类概述和使用
要想让网络中的计算机能够互相通信,必须为每台计算机指定一个标识号,通过这个标识号来指定要接受数据的计算机和识别发送的计算机. 在TCP/IP协议中,这个标识号就是IP地址. 那么,我们如果获取和操作I ...
- Android(java)学习笔记19:Java中InetAddress类概述和使用
1. 要想让网络中的计算机能够互相通信,必须为每台计算机指定一个标识号,通过这个标识号来指定要接受数据的计算机和识别发送的计算机. 在TCP/IP协议中,这个标识号就是IP地址. 那么,我们如果获取和 ...
- Java Socket InetAddress类 Socket DatagramPacket TCP、UDP示例
java.net :为实现网络应用程序提供类. InetAddress类 方法摘要 方法摘要 boolean equals(Object obj) : 将此对象与指定对象比较. byte[] getA ...
- [java语言]——InetAddress类的getByName()方法
InetAddress---表示互联网协议(IP)地址 ---InetAddress.getByName("www.163.com")----在给定主机名的情况下确定主机的IP地址 ...
- java网络编程(2)InetAddress 类及udp协议
InetAddress 类 JDK中为开发网络应用程序提供了java.net包,该包下的类和接口差点儿都是为网络编程服务的. InetAddress:用于描写叙述IP地址的对象 InetAddress ...
- InetAddress类的使用
1.1. 简介 IP地址是IP使用的32位(IPv4)或者128位(IPv6)位无符号数字,它是传输层协议TCP,UDP的基础.InetAddress是Java对IP地址的封装,在java.net中有 ...
- Java知多少(103)网络编程之IP地址和InetAddress类
Java语言的优势之一是Java程序能访问网络资源.Java提供一系列的类支持Java程序访问网络资源. TCP/IP协议和IP地址 为了进行网络通信,通信双方必须遵守通信协议.目前最广泛使用的是TC ...
随机推荐
- 软件project(一)——宏观总结
曾经看视频,看过去就忘.不想再这样子下去了,所以总结了好久.想让自己忘不了.这个过程花费时间有点长,可是假设让自己忘不了.一切都值了. 以下先来一张导图来总结一下<软件project>这门 ...
- [Backbone]6. Collections.
Define a collection: var AppointmentList = Backbone.Collection.extend({model: Appointment}); RESET t ...
- svn自助改动password(PHP脚本实现)
#创建脚本文件夹 mkdir -p /var/www/svn/svntools #创建apache配置文件 touch /etc/httpd/conf.d/alias.conf #输入下面内容: Al ...
- 防盗链Nginx设置图片防盗链,设置无效的请仔细看红字
*******************************************************************切记,替换的图片地址要使用没有防盗链的网站图片,否则由于替换的图片 ...
- ZH奶酪:Yii PHP sum SQL查询语句
例子: $sql = 'SELECT SUM(o.price) as `sum` FROM `order` o WHERE o.customer_id ='.$profile->id; $ret ...
- 第十一节,命名空间namespace
1,命名空间的定义 命名空间可以把不同的方法分散到不同的文件去实现,如果你会objective-C,他的作用和里面的类目有异曲同工之妙.当然了也有很多不同的地方,首先要明白的是,命名空间并不是一个类, ...
- 【转】Spring中IoC的优点与缺点
1. 优点 我们知道,在Java基本教程中有一个定律告诉我们:所有的对象都必须创建:或者说:使用对象之前必须创建,但是现在我们可以不必一定遵循这个定律了,我们可以从Ioc容器中直接获得一个对象然后直接 ...
- EasyMock的使用
1.Mock 方法是单元测试中常见的一种技术,它的主要作用是模拟一些在应用中不容易构造或者比较复杂的对象,从而把测试与测试边界以外的对象隔离开.同时也可以当调用别人的模块,而该模块又没有实现时(只提供 ...
- JDBC的简单操作
JDBC是一组能够执行SQL语句的API 由于传统的数据库操作方式需要程序员掌握各个不同的数据库的API,极其不便 因此java定义了JDBC这一标准的接口和类,为程序员操作数据库提供了统一的方式 J ...
- awk备忘
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各 ...