当前位置: 首页 > 面试题库 >

如何用Java确定Internet网络接口

徐柏
2023-03-14
问题内容

您如何确定使用Java的哪个网络接口连接到Internet?例如,我跑步

InetAddress.getLocalHost().getHostAddress();

在Eclipse中,这恰好返回了我想要的值192.168.1.105。但是,如果我将此文件打包到jar文件中并运行程序,则代码将返回169.254.234.50。对此进行调查后,我发现这是机器上的VMware虚拟以太网适配器接口的IP地址。

有什么方法可以确定连接到Internet的接口,但同时又可以保持我代​​码的可移植性?

接口比较

接口[net4]

display name  : Intel(R) Centrino(R) Ultimate-N 6300 AGN
MTU           : 1500
loopback      : false
point to point: false
up            : true
virtual       : false
multicast     : true
HW address    : 00 24 D7 2C 5F 70 
INET address (IPv4): 192.168.1.105
  host name           : MyComputer
  canonical host name : MyComputer
  loopback            : false
  site local          : true
  any local           : false
  link local          : false
  multicast           : false
  reachable           : true

接口[eth5]

display name  : VMware Virtual Ethernet Adapter for VMnet1
MTU           : 1500
loopback      : false
point to point: false
up            : true
virtual       : false
multicast     : true
HW address    : 00 50 56 C0 00 01 
INET address (IPv4): 169.254.234.50
  host name           : MyComputer
  canonical host name : MyComputer
  loopback            : false
  site local          : false
  any local           : false
  link local          : true
  multicast           : false
  reachable           : true

第三个VMware界面的站点为local = true,链接为local = false,因此这些字段也无济于事。


问题答案:

在我的笔记本电脑上(运行Windows 7,安装了Virtual
Box及其网络接口),以下代码将打印出我的无线接口的名称以及本地地址。它在一天结束时使用暴力手段,但只会尝试并实际连接到被认为是最佳候选人的地址。

// iterate over the network interfaces known to java
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
OUTER : for (NetworkInterface interface_ : Collections.list(interfaces)) {
  // we shouldn't care about loopback addresses
  if (interface_.isLoopback())
    continue;

  // if you don't expect the interface to be up you can skip this
  // though it would question the usability of the rest of the code
  if (!interface_.isUp())
    continue;

  // iterate over the addresses associated with the interface
  Enumeration<InetAddress> addresses = interface_.getInetAddresses();
  for (InetAddress address : Collections.list(addresses)) {
    // look only for ipv4 addresses
    if (address instanceof Inet6Address)
      continue;

    // use a timeout big enough for your needs
    if (!address.isReachable(3000))
      continue;

    // java 7's try-with-resources statement, so that
    // we close the socket immediately after use
    try (SocketChannel socket = SocketChannel.open()) {
      // again, use a big enough timeout
      socket.socket().setSoTimeout(3000);

      // bind the socket to your local interface
      socket.bind(new InetSocketAddress(address, 8080));

      // try to connect to *somewhere*
      socket.connect(new InetSocketAddress("google.com", 80));
    } catch (IOException ex) {
      ex.printStackTrace();
      continue;
    }

    System.out.format("ni: %s, ia: %s\n", interface_, address);

    // stops at the first *working* solution
    break OUTER;
  }
}

(我已isReachable(...)根据MockerTim的答案更新了我的答案。)

需要注意的一件事。socket.bind(...)如果我尝试连续太快地运行我的代码(例如连接清理得不够快),就会对我说地址和端口已经被使用了。8080应该是一个随机端口。



 类似资料:
  • 问题内容: 我想知道下面的方法是否可以检查我是否都已连接到网络,并且实际上也可以连接到互联网。 不只是连接到不允许我访问互联网的网络吗? 我认为确实如此,但我不确定100%。 谢谢 问题答案: 通过比较这篇文章中可接受的答案和您的代码,您正在做什么。随意比较代码。最安全的做法是在飞行模式下,关闭WiFi并在远离WiFi的位置进行一些测试,以确保安全。祝好运。

  • 问题内容: 在或中,是否有一个选项可以指定网络接口来发起连接? 编辑:在OS级别的AFAIK,我可以指定地址级别,或将负载平衡到路由表中。但是我软件中接口选择的方式不止于此,我想知道我是否可以在代码中做到这一点。 问题答案: 节点具有以下内置功能: http://nodejs.org/api/net.html#net_net_connect_options_connectionlistener h

  • 对于一个附带项目,我试图收集与梦幻足球相关的NFL球员的统计数据。我找到了一个URL,其中包含我想要的数据:https://www.cbssports.com/fantasy/football/stats/QB/2020/ytd/stats/ppr/ 我试图在R中勉强应付,但运气不好。我试过很多东西,最接近的是: 这是我到目前为止得到的代码,结果如下: 我尝试将其输入html_text(),结果我

  • 问题内容: 在我的Java应用程序中,如何检测Internet连接速度有多快?例如,我在家中使用AT&T Fast DSL,我想知道是否有一种方法可以编写执行以下操作的方法: 它将返回以kbps为单位的数字,例如2800kbps [2.8 M] 编辑:我要问的原因是在我的应用程序中,我可以打开多个Internet流,具体取决于用户的Internet连接速度,我希望它自动确定要打开多少个流而不会中断

  • 问题内容: 我只是四处看看,以了解如何制作一个程序来监听Java中的网络流量,但是我什么也找不到。我想知道是否可以通过任何方式查看网络流量。我听说过Socket的想法,但我不知道该如何工作。因此,无论如何,只是寻找一个API或自己编写一种方法。 编辑: 我很乐意想要一个API,但我也想澄清一下使用Socket嗅探通信的方式。 问题答案: jpcap,jNetPcap-是Java中的pcap包装器项

  • 问题内容: 我凭经验发现 绑定到当前计算机上的所有网络接口(而不仅仅是localhost-127.0.0.1或主机名),但是我无法找到说明这是可以保证的文档。 问题:在Java中绑定到0.0.0.0的定义将始终绑定到所有网络接口? 问题答案: 使用将仅绑定到启用IPv4的接口。但是,如果绑定到,则假定您的TCP / IP堆栈(和Java)启用了IPv4兼容的IPv6套接字,则该协议应涵盖所有IPv