本文为原创,如需转载,请注明作者和出处,谢谢!
上一篇:Java网络编程从入门到精通(10):Inet4Address类和Inet6Address类
从JDK1.4开始,Java提供了一个NetworkInterface类。这个类可以得到本机所有的物理网络接口和虚拟机等软件利用本机的物理网络接口创建的逻辑网络接口的信息。
一、创建NetworkInterface对象的两个静态方法
NetworkInerface类和InetAddress一样,也没有public的构造方法。因此,必须通过它的两个静态方法来创建NetworkInterface对象。可以使用两种方法来创建NetworkInterface对象:网络接口名(getByName方法)和IP地址(getByInetAddress方法)。
1.getByName方法
这个方法可以通过网络接口名来创建NetworkInterface对象。这个网络接口名并不是计算机名,而是用于标识物理或逻辑网络接口的名字,一般是由操作系统设置的。网络接口名在大多数操作系统上(包括Windows、Linux和Unix)是以eth开头,后面是网络接口的索引号,从0开始。如本机安了三块网卡,那么网络接口名就依次是eth0、eth1和eth2。NetworkInterface对象的toString方法可以返回网络接口的名称、显示名和这个网络接口上绑字的所有IP地址等信息。当网络接口名不存在时,getByName返回null。getByName方法定义如下:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->publicstaticNetworkInterfacegetByName(Stringname)throwsSocketException
下面的代码是一个显示指定网络接口信息的程序,网络接口名通过命令行参数传入。
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->package mynet;
importjava.net.*;
publicclass MyNetworkInterface1
{
publicstaticvoidmain(String[]args)throwsException
{
if(args.length==0)
return;
NetworkInterfaceni=NetworkInterface.getByName(args[0]);
System.out.println((ni==null)?"网络接口不存在!":ni);
}
}
执行如下命令:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->javamynet.MyNetworkInterface1eth0
运行结果:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->name:eth0(RealtekRTL8139FamilyPCIFastEthernetNIC)index:4addresses:
/192.168.18.10;
/192.168.18.20;
执行如下命令:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->javamynet.MyNetworkInterface1abcd
运行结果:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->网络接口不存在!
2.getByInetAddress方法
除了可以使用网络接口名来得到网络接口的信息,还可以利用getByInetAddress方法来确定一个IP地址属于哪一个网络接口。由于getByInetAddress方法必须使用一个InetAddress对象封装的IP地址来作为参数,因此,在使用getByInetAddress方法之前,必须先创建一个InetAddress对象。但要注意不能使用远程的IP的域名来创建InetAddress对象,否则getByInetAddress将返回null。getByInetAddress方法的定义如下:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->publicstaticNetworkInterfacegetByInetAddress(InetAddressaddr)throwsSocketException
下面代码可以确定一个IP地址属于哪一个网络接口,这个IP地址通过命令行参数传入。
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->package mynet;
importjava.net.*;
publicclass MyNetworkInterface2
{
publicstaticvoidmain(String[]args)throwsException
{
if(args.length==0)return;
InetAddresslocal=InetAddress.getByName(args[0]);
NetworkInterfaceni=NetworkInterface.getByInetAddress(local);
System.out.println((ni==null)?"本机不存在此IP地址!":ni);
}
}
执行如下命令:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->javamynet.MyNetworkInterface2127.0.0.1
运行结果:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->name:lo(MSTCPLoopbackinterface)index:1addresses:
/127.0.0.1;
/0:0:0:0:0:0:0:1;
执行如下命令:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->javamynet.MyNetworkInterface2218.61.151.22
运行结果:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->name:ppp0(WAN(PPP/SLIP)Interface)index:0addresses:
/218.61.151.22;
测试2使用的IP地址218.61.151.22是ADSL连接临时分配给本机的IP地址,因此,运行结果返回的ppp0是ADSL网络接口。
二、得到本机所有的网络接口
NetworkInterface可以通过getNetworkInterfaces方法来枚举本机所有的网络接口。我们也可以利用getNetworkInterfaces得到的网络接口来枚举本机的所有IP地址。当然,也可以通过InetAddress类的getAllByName来得到本机的所有IP地址。但getNetworkInterfaces方法可以按网络接口将这些IP地址进行分组,这对于只想得到某个网络接口上的所有IP地址是非常有用的。getNetworkInterfaces方法的定义如下:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->publicstaticEnumeration<NetworkInterface>getNetworkInterfaces()throwsSocketException
下面代码演示了如何使用getNetworkInterfaces方法得到本机所有的网络接口。
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->package mynet;
importjava.net.*;
importjava.util.*;
publicclass MyNetworkInterface3
{
publicstaticvoidmain(String[]args)throwsException
{
Enumeration<NetworkInterface>nis=NetworkInterface.getNetworkInterfaces();
while(nis.hasMoreElements())
System.out.println(nis.nextElement());
}
}
运行结果(部分):
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->
name:lo(MSTCPLoopbackinterface)index:1addresses:
/127.0.0.1;
/0:0:0:0:0:0:0:1;
name:eth0(RealtekRTL8139FamilyPCIFastEthernetNIC)index:4addresses:
/192.168.18.10;
/192.168.18.20;
name:ppp0(WAN(PPP/SLIP)Interface)index:0addresses:
/218.61.151.22;
上面的运行结果只是一种可能的结果,读者在运行上面的程序时根据本机的硬件和软件的配置不同,运行结果可能会有所不同。
三、NetworkInterface类的Getter方法
NetworkInterface类提供了三个方法可以分别得到网络接口名(getName方法)、网络接口别名(getDisplayName方法)以及和网络接口绑定的所有IP地址(getInetAddresses方法)。
1.getName方法
这个方法用来得到一个网络接口的名称。这个名称就是使用getByName方法创建NetworkInterface对象时使用的网络接口名,如eth0、ppp0等。getName方法的定义如下:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->publicStringgetName()
2.getDisplayName方法
这个方法可以得到更容易理解的网络接口名,也可以将这个网络接口名称为网络接口别名。在一些操作系统中(如Unix),getDisplayName方法和getName方法的返回值相同,但在Windows中getDisplayName方法一般会返回一个更为友好的名字,如Realtek RTL8139 Family PCI Fast
Ethernet NIC。getDisplayName方法的定义如下:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->publicStringgetDisplayName()
3.getInetAddresses方法
NetworkInterface类可以通过getInetAddresse方法以InetAddress对象的形式返回和网络接口绑定的所有IP地址。getInetAddresses方法的定义如下:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->publicEnumeration<InetAddress>getInetAddresses()
上面的代码演示了如果使用上述三个Getter方法。
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->package mynet;
importjava.net.*;
importjava.util.*;
publicclass MyNetworkInterface4
{
publicstaticvoidmain(String[]args)throwsException
{
if(args.length==0)
return;
NetworkInterfaceni=NetworkInterface.getByName(args[0]);
System.out.println("Name:"+ni.getName());
System.out.println("DisplayName:"+ni.getDisplayName());
Enumeration<InetAddress>addresses=ni.getInetAddresses();
while(addresses.hasMoreElements())
System.out.println(addresses.nextElement().getHostAddress());
}
}
1. 测试
执行如下命令:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->javamynet.MyNetworkInterface4eth0
运行结果:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->Name:eth0
DisplayName:RealtekRTL8139FamilyPCIFastEthernetNIC
192.168.18.10
192.168.18.20
下一篇:
Java网络编程从入门到精通(12):使用isReachable方法探测主机是否可以连通
国内最棒的Google Android技术社区(eoeandroid),欢迎访问!《银河系列原创教程》发布《Java Web开发速学宝典》出版,欢迎定购
分享到:
相关推荐
Java网络编程
windows MFC入门到精通 windows 高级编程 windows 网络编程 Programming Windows Programming Windows with MFC Programming Applications for Windows Network Programming for Microsoft Windows ...
java网络编程 第4版 源码, java network programming 4th edition source code 网上不好找,刚和老外要的
[奥莱理] Java 网络编程 第4版 (英文版) [奥莱理] Java Network Programming 4th Edition (E-Book) ☆ 图书概要:☆ This practical guide provides a complete introduction to developing network programs ...
在这之前,我搜索英文信息通常用AltaVista,而搜索中文信息则常用Sina。但自使用了Google之后,它便成为我的Favorite Search engine了。这也得感谢新浪网友曹溪,因为当初正是因为他的大力推介,才使我识得了Google...
比较经典的讲stream,socket的书吧,具体信息可以去各商城上看,本人也买了纸质书,这个仅为在电脑或pad上看着方便
Java网络编程(第三版)中文版(不看后悔) JAVA Network Programming,Third Edition 原出版社: O'Reilly 作者: (美)Elliotte Rusty Harold [作译者介绍] 译者: 朱涛江[同译者作品] 林剑 丛书名: O'...
本书内容全面,涵盖了从网络基础知识到远程方法调用(RMI)等各方面的内容,书中章节涉及到TCP和UDP socket、服务器socket、URL和URI、组播以及特殊用途的API(如JavaMail)等等。本书展示了如何使用JSSE编写安全的...
[Java网络编程(第3版,2004)].(Java.Network.Programming).Elliotte.Rusty.Harold.文字版 这个是pdf带目录的高清文字版,可以复制内容的。
Linux操作系统入门书,比较全面 目录 0 前言 0.1 什么是Linux? 0.2 本手册概述 0.3 速查信息 0.4 从以前版本的Red Hat Linux升级 0.5 开发者的话 0.6 编者的话 1 Red Hat Linux 5.1新特性 1.1 安装性能的...
java网络编程 Java.Network.Programming.3rd.Edition.Oct.2004
java.net.NetworkInterface 类包装器。 用法 按名称获取网络接口: => (by-name "eth3") #<NetworkInterface> 获取网络接口列表作为枚举: => (network-interfaces) #<java> 使用 EnumerationSeq 获取网络接口...
Java网络编程(第三版)中文版(不看后悔) JAVA Network Programming,Third Edition 原出版社: O'Reilly 作者: (美)Elliotte Rusty Harold [作译者介绍] 译者: 朱涛江[同译者作品] 林剑 丛书名: O'...
SDN(Software Defined Network)即软件定义网络,是一种网络设计理念,或者一种推倒重来的设计思想。
前几天看到公司一个大神看技术文档,打眼瞟了一下,全是英文的表示直接看看不到。但是大神不一样,人家是硕士哦,英文杠杠的,但是自己心里也想看...java网络编程第四版 java_concurrency_in_practice.pdf Java并发实践
Java中通过NetworkInterface获取主机地址和物理地址等;Java中通过NetworkInterface获取主机地址和物理地址等;Java中通过NetworkInterface获取主机地址和物理地址等
Network Driver Interface Specification,即网络驱动接口规范
用Java开发网络软件非常方便和强大,Java的这种力量来源于他独有的一套强大的用于网络的 API,这些API是一系列的类和接口,均位于包java.net和javax.net中。在这篇文章中我们将介绍套接字(Socket)慨念,同时以实例...
Java网络编程(第三版)中文版(不看后悔) JAVA Network Programming,Third Edition 原出版社: O'Reilly 作者: (美)Elliotte Rusty Harold [作译者介绍] 译者: 朱涛江[同译者作品] 林剑 丛书名: O'...