【问题标题】:get IP addresses of computer available on a network? -java获取网络上可用计算机的 IP 地址? -java
【发布时间】:2011-11-04 22:22:02
【问题描述】:

我正在制作一个文件共享应用程序,它将查找在同一网络上运行该应用程序的计算机。所以我希望我的应用程序能够发现计算机及其 IP 地址。使用 Java 可以完成这项任务吗?

谢谢

【问题讨论】:

  • 你可以创建一个公共的地方,比如一个服务器,所有网络计算机都会更新他们当前的ip,比如一个ip池。那也会更安全!并且其他计算机可以从池中获取可用的 ip。
  • 我同意,但我希望我的应用程序能够完成所有工作,而不是依赖任何外部设备/软件
  • 好吧,你能做什么,但同样效率不高!您可以进行点对点网络。并且每台可用的计算机都会使其他联网计算机奖励它们的存在。以这种方式工作太多了。为什么不是服务器?我的意思是即使是信使也使用融合!您检查谁在线,然后将点对点连接以进行聊天和文件共享。

标签: java jsp networking network-programming client-server


【解决方案1】:

这是分布式计算中的基本问题之一,在一定程度上有两种可行的方法:

注册服务

  • 在网络的某个地方,您使用众所周知的主机和端口号运行注册表服务。此服务必须可从您要运行应用程序的每个位置访问/寻址。

  • 在启动时,网络上的每个应用程序实例都会向注册表注册。

  • 当某些机器/程序需要定位应用程序的实例时,它会询问注册表。

问题:

  • 您必须在不通知注册表的情况下处理“消失”的应用程序实例。

  • 如果注册表重新启动,您必须有办法恢复状态。

  • 应用程序必须知道注册表实例的名称(或地址)和端口。

广播/组播

  • 应用程序的每个实例都侦听众所周知的“广播”或“多播”地址/端口。

  • 当程序想要定位应用程序的实例时,它会发送广播/多播请求。

  • 每个实例都会响应请求并提供其详细信息。

  • 程序累积响应以构建所有“活动”实例的列表。

问题:

  • 这无法扩展。来自 M 个程序的每个请求都会发送到 N 台机器并生成 N 个响应。随着 M 和 N 的增长,网络流量呈二次方增长。

  • 广播和组播是有损的,尤其是在繁忙的网络上。

  • 广播通常不会跨越网络边界。多播需要特殊配置。


这两种方法都应该适用于实例数量有限的小型网络。

简单的方法是确定一种现有的分布式计算技术,它可以为您完成大部分工作。例如,RMI 和 RMI 注册中心、动态 DNS、CORBA、JINI。

【讨论】:

  • +1 用于广播。鉴于提问者陈述的(并且非常有限的)范围和要求,它应该实现所需的功能。
【解决方案2】:

我找到了这个问题的答案。我环顾四周,找到了这段代码。这不是最好的方法,但它确实有效..

import java.io.IOException;
import java.net.InetAddress;

public class networkPing {

public static void main(String[] args) throws IOException {

    InetAddress localhost = InetAddress.getLocalHost();
    // this code assumes IPv4 is used
    byte[] ip = localhost.getAddress();

    for (int i = 1; i <= 254; i++)
    {
        ip[3] = (byte)i;
        InetAddress address = InetAddress.getByAddress(ip);
    if (address.isReachable(1000))
    {
        System.out.println(address + " machine is turned on and can be pinged");
    }
    else if (!address.getHostAddress().equals(address.getHostName()))
    {
        System.out.println(address + " machine is known in a DNS lookup");
    }

    }

}
}

【讨论】:

  • 注意:这是一种简化的方法,它假设 /24 子网掩码 (255.255.255.0)。如果您在使用不同子网设置的网络上,您的“本地地址”范围可能不像“1-254”那么简单。
【解决方案3】:

这里的一个问题是“同一个网络”的定义不明确。你是说子网吗?在路由器之前所有节点都可达?

例如,如果您的意思是“局域网”,这在 TCP 中没有任何意义,但 SAMBA 可能会有所帮助。

如果您可以让其他节点响应,则可以通过使用适当范围的多播来解决其中的一些问题。或者,如果您知道子网掩码,您可以只进行 IP 地址运算。但是您需要先更准确地定义您的问题。

【讨论】:

    【解决方案4】:

    你应该看看this article on jxta。它是 sun 的 Java P2P 框架,被大量流行的应用程序使用。看看一些使用 jxta 的应用程序也可能会很好,因为它们可能已经在执行您正在尝试执行的操作。

    【讨论】:

    • 没有任何附加信息的外部网站链接不是答案,也不应该这样发布。答案应该独立存在,以便它们保持有用和可搜索。发布附加信息的链接很好,但只发布链接应该是评论。遵循这些准则有助于使本网站保持有用且整洁。
    • @Ken 感谢您的提醒。我分心了,必须在完成之前提交!
    【解决方案5】:

    要么使用多播 DNS(我不知道你如何在 Java/Windows 上使用它)。

    或者使用 IP 广播(使用 UDP)。

    【讨论】:

      【解决方案6】:

      每台计算机都应将DatagramPacket s 发送到多播组。还接收来自该组的数据包。然后使用getAddress() 从数据包中获取InetAddress 对象。

      记住:要接收多播数据包,系统应该加入多播组。但是任何人(无需加入)都可以向多播组发送数据包。

      Example is here.

      【讨论】:

        【解决方案7】:

        我发现 Apache commons JCS(一个缓存库)的这个实用程序类部分特别有用,我只是将它复制到我的项目中,因为我不想/不需要包含整个 JCS 库并且该代码在其他地方不可用(例如在 apache commons-net 中会很好):

        【讨论】:

          猜你喜欢
          • 2014-04-15
          • 2011-06-12
          • 2012-10-28
          • 1970-01-01
          • 2015-03-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多