Java网络编程学习笔记 NetworkInterface

NetworkInterface类表示一个由名称例如“eth0”、“net2”和分配给此接口的IP地址列表组成的网络接口。该类提供访问网卡设备的相关信息,例如可以获取网卡名称、IP地址和子网掩码等。


创建NetworkInterface对象

由于NetworkInterface对象表示物理硬件和虚拟地址,所以不能任意构造,而是提供了一些静态工厂方法通过名称、IP地址或者枚举的方式返回与某个网络接口关联的NetworkInterface对象。

1.getByName(String name)方法根据指定名称返回一个NetworkInterface对象。名称的格式与平台有关,在UNIX系统上以太网接口名称的形式为“eth0”、“eth1”等。本地回送地址的名称可能类似“lo”。

public static NetworkInterface getByName(String name) throws SocketException {
    if (name == null)
        throw new NullPointerException();
    return getByName0(name);
}

private native static NetworkInterface getByName0(String name)
    throws SocketException;

2.getByInetAddress(InetAddress addr)方法返回一个与指定IP地址绑定的NetworkInterface对象。如果指定的IP地址绑定了多个网络接口,则不确定返回哪个网络接口。在Linux系统中,bonding的含义是将多个物理网卡抽象成一个网卡,能够提升网络吞吐量,实现网络冗余、负载等功能。

public static NetworkInterface getByInetAddress(InetAddress addr) throws SocketException {
    if (addr == null) {
        throw new NullPointerException();
    }
    if (addr instanceof Inet4Address) {
        校验...
    } else if (addr instanceof Inet6Address) {
        校验...
    } else {
        throw new IllegalArgumentException("invalid address type: " + addr);
    }
    return getByInetAddress0(addr);
}

private native static NetworkInterface getByInetAddress0(InetAddress addr)
    throws SocketException;

3.getNetworkInterfaces()方法返回一个java.util.Enumeration<NetworkInterface>对象,列出本地主机上所有网络接口。

public static Enumeration<NetworkInterface> getNetworkInterfaces()
    throws SocketException {
    final NetworkInterface[] netifs = getAll();

    return new Enumeration<NetworkInterface>() {
        private int i = 0;
        public NetworkInterface nextElement() {
            if (netifs != null && i < netifs.length) {
                NetworkInterface netif = netifs[i++];
                return netif;
            } else {
                throw new NoSuchElementException();
            }
        }

        public boolean hasMoreElements() {
            return (netifs != null && i < netifs.length);
        }
    };
}

获取方法

1.getInetAddresses()方法返回一个java.util.Enumeration<InetAddress>对象,列出与这个网络接口绑定的所有IP地址,包括IPv4地址和IPv6地址。

NetworkInterface networkInterface = NetworkInterface.getByName("lo");
Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses();
while (inetAddresses.hasMoreElements()) {
    System.out.println(inetAddresses.nextElement());
}

输出:
/127.0.0.1
/0:0:0:0:0:0:0:1

2.getName()方法和getDisplayName()方法返回网络接口在操作系统中的名称,不同的是getName()方法返回的名称仅仅是类似“eth0”这样的代号,而getDisplayName()方法返回的名称还包含厂商名称和网卡具体型号等相关信息。

NetworkInterface networkInterface = NetworkInterface.getByName("eth0");
System.out.println(networkInterface.getName());
System.out.println(networkInterface.getDisplayName());

输出:
eth0
Realtek PCIe GbE Family Controller

3.isUp()方法判断该网络接口是否已经开启并且正常工作。

public boolean isUp() throws SocketException {
    return isUp0(name, index);
}

private native static boolean isUp0(String name, int ind) throws SocketException;

4.isLoopback()方法判断该网络接口是否是localhost回环接口,如果一个网络设备是回环接口,那么它永远工作并且还是虚拟的,也就是计算机上并不存在这样的硬件网络设备,如果计算机没有安装物理硬件网卡但安装了Tomcat,就可以使用localhost或者127.0.0.1访问Tomcat。

public boolean isLoopback() throws SocketException {
    return isLoopback0(name, index);
}

private native static boolean isLoopback0(String name, int ind) throws SocketException;

5.getMTU()方法返回该网络接口的MTU大小。在网络传输中是以数据包为基本传输单位,可以使用MTU(Maximum Transmission Unit,最大传输单元)来规定网络传输最大数据包的大小,单位为字节。以太网网卡的MTU大多数默认值是1500字节。MTU值设置的大小与传输效率有关,如果MTU设置大值,则传输速度很快,因为发送的数据包数量少了,但延迟很大,因为对方需要一点一点地处理数据;如果MTU设置小值,则传输速度慢,因为发送的数据包数量多了。

public int getMTU() throws SocketException {
    return getMTU0(name, index);
}

private native static int getMTU0(String name, int ind) throws SocketException;

6.getSubInterfaces()方法返回一个java.util.Enumeration<NetworkInterface>对象,列出该网络接口的所有子接口。子接口的作用是在不添加新的物理网卡的基础上,基于原有的网络接口设备再创建出一个虚拟的网络接口设备进行通信,这个虚拟的网络接口可以理解成是一个由软件模拟的网卡。Windows系统不支持子接口,而Linux系统支持。

7.isVirtual()方法判断该网络接口是否是虚拟子接口。

8.getParent()方法返回该网络接口的父接口。一个虚拟子接口必须依赖于父接口,也就是所属的硬件网卡。

9.getHardwareAddress()方法以字节数组的形式返回该网络接口的硬件地址,一般是MAC(Media Access Control,媒体访问控制),它是网络设备的唯一ID,采用十六进制表示,一共48位,可以使用“ipconfig -all”命令查看。

NetworkInterface networkInterface = NetworkInterface.getByName("eth0");
System.out.println(networkInterface.getDisplayName());
byte[] addr = networkInterface.getHardwareAddress();
System.out.println(org.apache.tomcat.util.buf.HexUtils.toHexString(addr));

输出:
eth0
Realtek PCIe GbE Family Controller
34f1abdc6efb

10.isPointToPoint()方法判断该网络接口是否是点对点设备。点对点的主要目的是通过拨号或者专线方式建立连接发送数据,是各种主机、网桥和路由器之间简单连接的一种通信解决方案。

11.supportsMulticast()方法判断该网络接口是否支持多播。多播也称为组播,是一种一对多的网络,它可以对某些计算机分配多播类型的IP地址以进行分组,然后只针对这些计算机发送数据。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
嗨!很高兴回答你关于Java并发编程的问题。请问你想知道什么方面的内容呢?我可以分享一些学习笔记和建议给你。 1. 并发编程基础:了解并发编程的基本概念,如线程、进程、锁、同步等。学习Java中的并发编程模型以及相关的API,如Thread、Runnable、Lock、Condition等。 2. 线程安全性:学习如何保证多线程环境下的数据安全性,了解共享资源的问题以及如何使用同步机制来防止数据竞争和并发问题。 3. 线程间的通信:掌握线程间的通信方式,如使用wait/notify机制、Lock/Condition等来实现线程的协调与通信。 4. 并发容器:学习并发容器的使用,如ConcurrentHashMap、ConcurrentLinkedQueue等。了解它们的实现原理以及在多线程环境下的性能特点。 5. 并发工具类:熟悉Java提供的并发工具类,如CountDownLatch、CyclicBarrier、Semaphore等,它们可以帮助你更方便地实现线程间的协作。 6. 并发编程模式:学习一些常见的并发编程模式,如生产者-消费者模式、读者-写者模式、线程池模式等。了解这些模式的应用场景和实现方式。 7. 性能优化与调试:学习如何分析和调试多线程程序的性能问题,了解一些性能优化的技巧和工具,如使用线程池、减少锁竞争、避免死锁等。 这些只是一些基本的学习笔记和建议,Java并发编程是一个庞大而复杂的领域,需要不断的实践和深入学习才能掌握。希望对你有所帮助!如果你有更具体的问题,欢迎继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值