[疯狂Java]网络:IP地址和端口号

来源:互联网 发布:ar java技术实现 编辑:程序博客网 时间:2024/06/05 21:10

1. IP地址和端口号:

    1) IP地址用于在网络中唯一标识一台机器(通信实体),是一个32位整数,通常用4个0-255的十进制数标识;

    2) 端口号用于唯一标识通信实体上进行网络通讯的程序,同一台机器上不能用有两个程序占用同一个端口:

         i. 端口号是一个16位整数,共有3类;

         ii. 公认端口:0-1023,它们紧密绑定一些特定的服务(比如TCP/IP通信协议程序的端口);

         iii. 注册端口:1024-49151,它们松散绑定一些特定服务,其余可以随意使用,应用程序用的最多端口号来自于这个范围;

         iv. 动态/私有端口:49152-65535,这些端口一般是应用程序运行时临时地、动态地占用,可以说是一种竞争资源吧,应用程序本身不会和这些端口绑定,一般会将其作为资源利用;

    3) 也就是说真正参与网络通信的对象是计算机上的程序(网络通信程序),IP地址是它的街道门牌,而端口是它的房间号;


2. Java的IP地址类:

    1) InetAdress是Java的IP地址类,它的对象就代表一个IP地址,它有两个重要的子类,一个是Inet4Adress,另一个是Inet6Adress,分别表示IPv4和IPv6地址,IPv6地址有64位,是下一代互联网的主打;

    2) 创建InetAdress对象:Java并没有为其提供构造器,而是使用静态方法来构造InetAdress对象;

         i. static InetAddress getByName(String host); // 根据主机名创建对象,主机名就是英文字母地址,比如"www.xxx.com"之类的

         ii. static InetAddress getByAddress(byte[] addr); // 根据4字节地址创建对象,比如new byte[] {192, 168, 10, 1}之类的

         iii. static InetAddress getLocalHost(); // 直接获取本机IP地址并创建对象(即本机接入互联网的IP地址,不是本地回环地址127.0.0.1)

    3) 查询地址信息:调用InetAdress的对象方法获取和地址有关的信息

         i. String getHostName(); // 获取主机英文字符名,即"www.xxx.com"之类的

         ii. String getHostAddress(); // 获取主机4位十进制数地址(以字符串形式返回),比如"192.168.10.2",注意是字符串,不是byte[]

         iii. String getCanonicalHostName(); // 获取主机的全限定域名(FQDN,Fully-Qualified-Domain-Name)

    4) 检查地址是否可达:调用InetAdress的isReachable方法

         i. boolean isReachable(int timeout);

         ii. 内部调用ping命令查看是否可达;

         iii. timeout是限时,如果超过该限时还未响应就直接判定为不可达,时间单位是毫秒;

         iv. 注意:该方法会尽一切可能和目标建立通信,如果设置了防火墙之类的可能会阻塞该方法而返回false;

    5) 示例:

public class Test {private final static String baidu = "www.baidu.com";private final static byte[] local = new byte[] {127, 0, 0, 1};private static void print(InetAddress ip) throws IOException {System.out.println("Host Adress: " + ip.getHostAddress());System.out.println("Host Name: " + ip.getHostName());System.out.println("Canonical Host Name: " + ip.getCanonicalHostName());}public static void main(String[] args) throws IOException {InetAddress ip = InetAddress.getByName(baidu);print(ip);ip = InetAddress.getByAddress(local);print(ip);ip = InetAddress.getLocalHost();print(ip);}}


0 0
原创粉丝点击