2.1 套接字地址

来源:互联网 发布:京东精选 知乎 编辑:程序博客网 时间:2024/06/15 00:09
  1. InetAddress类代表一个网络目标地址,包括主机名和数字类型的地址信息。

  2. 该类有两个子类Inet4Address和Inet6Address分别代表IPV4和IPV6。

  3. InetAddress实例不可变。

  4. IP地址实际上是分配给了主机和网络之间的连接,而不是主机本身。

  5. NetworkInterface类提供了访问本机所有接口信息的功能,这个功能非常有用,比如当一个程序需要通知其他程序其IP地址时就会用到。

  6. 实例程序-获取本机地址(三个命令行参数:www.mkp.com blah.blah 129.35.69.7)

    public class InetAddressExample {public static void main(String[] args) {    try {//          获取主机的网络接口列表        Enumeration<NetworkInterface> interfaceList = NetworkInterface.getNetworkInterfaces();        if(interfaceList==null){            System.out.println("没有找到任何网络接口");        }else{            while(interfaceList.hasMoreElements()){                NetworkInterface iface = interfaceList.nextElement();//                  打印网络接口名,通常由字母和数字组成,代表接口类型和具体实例    System.out.println("NetworkInterface:"+iface.getName()+":");                Enumeration<InetAddress> addressList = iface.getInetAddresses();                if(!addressList.hasMoreElements()){                    System.out.println("\tNo address for this interface");                    continue;                }//                  打印每个网络接口的地址                while (addressList.hasMoreElements()) {                    InetAddress inetAddress = (InetAddress) addressList.nextElement();                    System.out.println("\taddress"+                            (inetAddress instanceof Inet4Address?"(V4):":                                (inetAddress instanceof Inet6Address?"(v6):":"(?):"))+                                    inetAddress.getHostAddress());                }            }        }    } catch (SocketException e) {        System.out.println("Error getting network interfaces:"+e.getMessage());    }//      获取命令行输入的每个参数所对应的主机名和地址    for(String host:args){        try {            System.out.println(host+":");//              获取给定主机名/地址的相关地址列表            InetAddress[] addressList = InetAddress.getAllByName(host);            for(InetAddress address:addressList){//                  打印主机名和数字型地址                System.out.println("\t"+address.getHostName()+"\t"+address.getHostAddress());            }        } catch (UnknownHostException e) {            System.out.println("\tUnable to find address for "+host);        }    }   }} 

    当使用假地址“blah.blah”时,系统会尝试各种不同的方法将主机名解析成IP地址,会耗费大量时间。因此最好能使用点分形式的IP地址来访问一个主机。
    如果远程主机由名字指定,那么运行实例程序的主机必须配置为能够将名字解析成地址。如果能够通过主机名字ping到该主机(在命令行窗口执行“ping server.example.com”),那么实例程序中就可以使用主机名。

  7. InetAddress: 创建和访问

    static InetAddress[] getAllByName(String host) // 返回与主机名对应的所有地址;static InetAddress getByName(String host) // 通过主机名获取地址static InetAddress getLocalHost() // 获取本地主机的地址byte[] getAddress() // 获取IP地址的二进制形式
  8. InetAddress: 字符串表示

     String toString() // 返回“主机名/数字型IP地址” String getHostAddress() // 返回“数字型IP地址” String getHostName() // 返回“主机名”,解析失败时返回数字型IP String getCanonicalHostName() // 返回“主机域名全称”,如果同一地址对应多个名称,该方法返回的主机名可能与最初创建实例的主机名不同。解析失败时返回数字型IP
  9. InetAddress:检测属性

    boolean isAnyLocalAddress() //任意本地地址boolean is LinkLocalAddress() //本地链接地址boolean isLoopbackAddress() //回环地址boolean isMulticastAddress() //广播地址boolean isMCGlobal() //全球范围的广播地址boolean isMCLinkLocal() //子网广播地址boolean isMCNodeLocal() //本地接口地址boolean isMCOrgLocal() //组织范围的广播地址boolean isMCSiteLocal() //站点范围的广播地址//是否能与InetAddress地址确定的主机进行数据报文交换。boolean isReachable(int timeout) boolean isReachable(NetworkInterface netif, int ttl, int timeout)
  10. NetworkInterface:创建、获取信息

    static Enumeration<NetworkInterface> getNetworkInterfaces();static NetworkInterface getByteInetAddress(InetAddress addr);static NetworkInterface getByName(String name);Enumeration<InetAddress> getInetAddresses();String getName();String getDisplayName();

    第一个方法非常有用,可以获取当前主机的网络接口列表,再使用列表中的子项实例getInetAddresses()获得每个网络接口的所有地址。但是并不是所有地址都能通过互联网访问,并且地址时乱序的,并不是第一个接口的第一个地址能够通过互联网访问。而要通过InetAddress的属性检查方法判断。
    getName()返回接口名,在很多系统中回环地址都是lo0

0 0
原创粉丝点击