zoukankan      html  css  js  c++  java
  • Java Socket编程(2)如何识别网络主机

      通过前面的笔记我们可以知道:一个客户端想要发起一次通信,先决条件就是需要知道运行着服务器端程序的主机的IP地址是多少。然后我们才能够通过这个地址向服务器发送信息。

    获取主机地址信息

      在Java中我们使用InetAddress类来代表目标网络地址,包括主机名和数字类型的地址信息,并且InetAddress的实例是不可变的,每个实例始终指向一个地址。InetAddress类包含两个子类,分别对应两个IP地址的版本:

    • Inet4Address
    • Inet6Address

      我们通过前面的笔记可以知道:IP地址实际上是分配给主机与网络之间的连接,而不是主机本身,NetworkInterface类提供了访问主机所有接口的信息的功能。下面我们通过一个简单的示例程序来学习如何获取网络主机的地址信息:

     1 import java.net.*;
    2 import java.util.Enumeration;
    3
    4 public class InetAddressExample {
    5
    6 /**
    7 * @param args
    8 */
    9 public static void main(String[] args) {
    10 // TODO Auto-generated method stub
    11 try {
    12 // 获取主机网络接口列表
    13 Enumeration<NetworkInterface> interfaceList = NetworkInterface
    14 .getNetworkInterfaces();
    15 // 检测接口列表是否为空,即使主机没有任何其他网络连接,回环接口(loopback)也应该是存在的
    16 if (interfaceList == null) {
    17 System.out.println("--没有发现接口--");
    18 } else {
    19 while (interfaceList.hasMoreElements()) {
    20 // 获取并打印每个接口的地址
    21 NetworkInterface iface = interfaceList.nextElement();
    22 // 打印接口名称
    23 System.out.println("Interface" + iface.getName() + ";");
    24 // 获取与接口相关联的地址
    25 Enumeration<InetAddress> addressList = iface
    26 .getInetAddresses();
    27 // 是否为空
    28 if (!addressList.hasMoreElements()) {
    29 System.out.println("\t(没有这个接口相关的地址)");
    30 }
    31 // 列表的迭代,打印出每个地址
    32 while (addressList.hasMoreElements()) {
    33 InetAddress address = addressList.nextElement();
    34 System.out
    35 .print("\tAddress"
    36 + ((address instanceof Inet4Address ? "(v4)"
    37 : address instanceof Inet6Address ? "v6"
    38 : "(?)")));
    39 System.out.println(":" + address.getHostAddress());
    40 }
    41 }
    42 }
    43 } catch (SocketException se) {
    44 System.out.println("获取网络接口错误:" + se.getMessage());
    45 }
    46 // 获取从命令行输入的每个参数所对应的主机名和地址,迭代列表并打印
    47 for (String host : args) {
    48 try {
    49 System.out.println(host + ":");
    50 InetAddress[] addressList = InetAddress.getAllByName(host);
    51 for (InetAddress address : addressList) {
    52 System.out.println("\t" + address.getHostName() + "/"
    53 + address.getHostAddress());
    54 }
    55 } catch (UnknownHostException e) {
    56 System.out.println("\t无法找到地址:" + host);
    57 }
    58 }
    59
    60 }
    61 }

    查看运行效果:

    总结:

    在Java Socket编程中获取主机地址信息最关键的两个类是:InetAddressNetworkInterface,在Socket编程时必须了解这两个类的常用API和并且熟练的使用它们。

    参考资料:《TCP/IP Socket in Java》 

    作者:晴天猪

    出处:http://www.cnblogs.com/IPrograming 

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    opencv —— copyTo 设置与操作感兴趣区域(ROI)
    opencv —— src.at<Vec3b>(i, j)[0]、src.at<uchar>(i, j)、src.ptr<uchar>(i) 访问图像的单个像素
    opencv —— getTickCount、getTickFrequency 计时函数
    opencv —— setMouseCallback 响应鼠标操作事件
    opencv —— createTrackbar、getTrackbarPos 滑动条的创建和使用
    opencv —— imread、namedWindow & imshow、cvtColor、imwrite 加载、显示、修改、保存图像
    redis缓存穿透,缓存击穿,缓存雪崩问题
    NoSQL技术
    日期处理
    WIN2008中部署网站后样式及JS加载不了(转载)
  • 原文地址:https://www.cnblogs.com/IPrograming/p/Java_Socket_2.html
Copyright © 2011-2022 走看看