sun
中国技术社区的
java api
文档是
jdk5.0
的
,
发现它的更新速度相当不及时 ; 到现在也没见到 jdk6.0 api 的中文文档 ;
呵呵 , 偶的英语水平不是很好 . 只好到 sun 的官方文档下载 jdk6.0 文档 ( 英文的 );
jdk6.0 与 jdk5.0 的巨大变化 , 我就不多说了 , 网上多得的是 ,baidu 一搜就是一大堆 .
以前想获取 MAC 或一此网络的物理特性 , 一般都要使用 jni 技术 , 通过新建一个进程 (ipconfig/all 命令 ), 获取进程的数据流 , 从中再取得 Mac 地址 . 不过新的 jdk6.0 已经可以跨平台获得这些特性了 .
这里主要介绍在 java.net 包中的一些新增加的特性 .
分别打开 jdk5.0 和 jdk6.0 的文档 , 会发现新增了一个类为 java.net.InterfaceAddress,
而在类 NetworkInterface 中也新加了一些函数 :
1.“public byte[] getHardwareAddress()” :以一个字节数组形式返回这个网络接口的硬件地址 ;
2.“public int getMTU()” :返回这个网络接口的最大传输单位 (MTU)
3.“public List<InterfaceAddress> getInterfaceAddresses()” :返回一个 java.util.List ,它包含这个网络接口的所有接口地址
4.“public NetworkInterface getParent()” :如果这个网络接口是一个子接口,则返回这个网络接口的父网络接口
.............
以下是我得用这两个类做的测试 , 提取本机的网络接口信息 ;:
package cat.net;
import java.net.InetAddress;
import java.net.InterfaceAddress;
import java.net.NetworkInterface;
import static java.lang.System.*;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Iterator;
import java.util.List;
/**
*
* @author cattong
*/
public class NetInterfaceDemo {
/** Creates a new instance of NetInterfaceDemo */
public NetInterfaceDemo() {
}
/*
* 转化成 ip 地址 ;
*/
public static String changeToIP(byte b[]){
String ip=null;
if(b.length==4)
ip=b[0]+"."+b[1]+"."+b[2]+"."+b[3];
return ip;
}
/*
* 转化成十六进制 ;
*/
public static String changeToMAC(byte b[]){
String mac=null;
Byte bt=null;
if(b.length==6){
mac="";
String temp="";
int length=0;
for(int i=0;i<6;i++){
int n=b[i];
temp=Integer.toHexString(n);
length=temp.length();
if(length==1){
mac=mac+"0"+temp+"-";
}else{
//out.println(length);
mac=mac+Integer.toHexString(n).substring(length-2,length)+"-";
}
}
}
return mac;
}
public static void main(String[] args) throws SocketException, UnknownHostException {
NetworkInterface myInterface=NetworkInterface.getByInetAddress(InetAddress.getLocalHost());
out.println(" 硬件地址 :"+changeToMAC(myInterface.getHardwareAddress()));
out.println(" 网络接口的所有接口地址 :");
List<InterfaceAddress> list=myInterface.getInterfaceAddresses();
Iterator<InterfaceAddress> iter=list.iterator();
InetAddress inet=null;
InterfaceAddress inf=null;
while(iter.hasNext()){
inf=iter.next();
inet=inf.getAddress();
out.print(" "+changeToIP(inet.getAddress())+" "+inet.getAddress().length);
inet=inf.getBroadcast();
out.println(" 广播地址 :"+changeToIP(inet.getAddress()));
}
out.println(" 最大的传输单元 :"+myInterface.getMTU());
String parent=myInterface.getParent()==null?" 无 ":" 有 ";
out.println(" 是否存在一个父接口 :"+parent);
String son=myInterface.getSubInterfaces()==null?" 无 ":" 有 ";
out.println(" 是否存在一个子接口 :"+son);
out.println(" 网络接口是否是一个 loopback 接口 :"+myInterface.isLoopback());
out.println(" 网络接口是否是一个端到端的接口 :"+myInterface.isPointToPoint());
out.println(" 如果这个网络接口是 'up' 并且已经 'running':"+myInterface.isUp());
out.println(" 网络接口是否是一个虚拟接口 :"+myInterface.isVirtual());
out.println(" 网络接口是否支持多点传送 :"+myInterface.supportsMulticast());
}
}
结果 >>>>>>>>>>>>>:
硬件地址 :00-14-85-1b-e9-8b-
网络接口的所有接口地址 :
10.5.125.31 4 广播地址 :10.5.127.-1
10.5.124.31 4 广播地址 :10.5.124.-1
最大的传输单元 :1500
是否存在一个父接口 : 无
是否存在一个子接口 : 有
网络接口是否是一个 loopback 接口 :false
网络接口是否是一个端到端的接口 :false
如果这个网络接口是 'up' 并且已经 'running':true
网络接口是否是一个虚拟接口 :false
网络接口是否支持多点传送 :true
生成成功(总时间: 2 秒)
-----------------------------------------------
不过还是有点不太明白 , 就是广播地址最后一位是数应当是 1 才对 , 而不是 -1 啊 .
以上程序在 netbeas 上测试过 , 具体的 api 可以参考 jdk6.0.
如果是 window 系统可以对测试数据是否正确 : 运行 cmd-----> 输入 : ipconfig/all+ 回车
发现它的更新速度相当不及时 ; 到现在也没见到 jdk6.0 api 的中文文档 ;
呵呵 , 偶的英语水平不是很好 . 只好到 sun 的官方文档下载 jdk6.0 文档 ( 英文的 );
jdk6.0 与 jdk5.0 的巨大变化 , 我就不多说了 , 网上多得的是 ,baidu 一搜就是一大堆 .
以前想获取 MAC 或一此网络的物理特性 , 一般都要使用 jni 技术 , 通过新建一个进程 (ipconfig/all 命令 ), 获取进程的数据流 , 从中再取得 Mac 地址 . 不过新的 jdk6.0 已经可以跨平台获得这些特性了 .
这里主要介绍在 java.net 包中的一些新增加的特性 .
分别打开 jdk5.0 和 jdk6.0 的文档 , 会发现新增了一个类为 java.net.InterfaceAddress,
而在类 NetworkInterface 中也新加了一些函数 :
1.“public byte[] getHardwareAddress()” :以一个字节数组形式返回这个网络接口的硬件地址 ;
2.“public int getMTU()” :返回这个网络接口的最大传输单位 (MTU)
3.“public List<InterfaceAddress> getInterfaceAddresses()” :返回一个 java.util.List ,它包含这个网络接口的所有接口地址
4.“public NetworkInterface getParent()” :如果这个网络接口是一个子接口,则返回这个网络接口的父网络接口
.............
以下是我得用这两个类做的测试 , 提取本机的网络接口信息 ;:
package cat.net;
import java.net.InetAddress;
import java.net.InterfaceAddress;
import java.net.NetworkInterface;
import static java.lang.System.*;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Iterator;
import java.util.List;
/**
*
* @author cattong
*/
public class NetInterfaceDemo {
/** Creates a new instance of NetInterfaceDemo */
public NetInterfaceDemo() {
}
/*
* 转化成 ip 地址 ;
*/
public static String changeToIP(byte b[]){
String ip=null;
if(b.length==4)
ip=b[0]+"."+b[1]+"."+b[2]+"."+b[3];
return ip;
}
/*
* 转化成十六进制 ;
*/
public static String changeToMAC(byte b[]){
String mac=null;
Byte bt=null;
if(b.length==6){
mac="";
String temp="";
int length=0;
for(int i=0;i<6;i++){
int n=b[i];
temp=Integer.toHexString(n);
length=temp.length();
if(length==1){
mac=mac+"0"+temp+"-";
}else{
//out.println(length);
mac=mac+Integer.toHexString(n).substring(length-2,length)+"-";
}
}
}
return mac;
}
public static void main(String[] args) throws SocketException, UnknownHostException {
NetworkInterface myInterface=NetworkInterface.getByInetAddress(InetAddress.getLocalHost());
out.println(" 硬件地址 :"+changeToMAC(myInterface.getHardwareAddress()));
out.println(" 网络接口的所有接口地址 :");
List<InterfaceAddress> list=myInterface.getInterfaceAddresses();
Iterator<InterfaceAddress> iter=list.iterator();
InetAddress inet=null;
InterfaceAddress inf=null;
while(iter.hasNext()){
inf=iter.next();
inet=inf.getAddress();
out.print(" "+changeToIP(inet.getAddress())+" "+inet.getAddress().length);
inet=inf.getBroadcast();
out.println(" 广播地址 :"+changeToIP(inet.getAddress()));
}
out.println(" 最大的传输单元 :"+myInterface.getMTU());
String parent=myInterface.getParent()==null?" 无 ":" 有 ";
out.println(" 是否存在一个父接口 :"+parent);
String son=myInterface.getSubInterfaces()==null?" 无 ":" 有 ";
out.println(" 是否存在一个子接口 :"+son);
out.println(" 网络接口是否是一个 loopback 接口 :"+myInterface.isLoopback());
out.println(" 网络接口是否是一个端到端的接口 :"+myInterface.isPointToPoint());
out.println(" 如果这个网络接口是 'up' 并且已经 'running':"+myInterface.isUp());
out.println(" 网络接口是否是一个虚拟接口 :"+myInterface.isVirtual());
out.println(" 网络接口是否支持多点传送 :"+myInterface.supportsMulticast());
}
}
结果 >>>>>>>>>>>>>:
硬件地址 :00-14-85-1b-e9-8b-
网络接口的所有接口地址 :
10.5.125.31 4 广播地址 :10.5.127.-1
10.5.124.31 4 广播地址 :10.5.124.-1
最大的传输单元 :1500
是否存在一个父接口 : 无
是否存在一个子接口 : 有
网络接口是否是一个 loopback 接口 :false
网络接口是否是一个端到端的接口 :false
如果这个网络接口是 'up' 并且已经 'running':true
网络接口是否是一个虚拟接口 :false
网络接口是否支持多点传送 :true
生成成功(总时间: 2 秒)
-----------------------------------------------
不过还是有点不太明白 , 就是广播地址最后一位是数应当是 1 才对 , 而不是 -1 啊 .
以上程序在 netbeas 上测试过 , 具体的 api 可以参考 jdk6.0.
如果是 window 系统可以对测试数据是否正确 : 运行 cmd-----> 输入 : ipconfig/all+ 回车