代码之家  ›  专栏  ›  技术社区  ›  Federico Cristina

在Java中动态查找局域网中的其他主机

  •  6
  • Federico Cristina  · 技术社区  · 15 年前

    “聊天服务器”

    相反,每个主机都是一个具有 文件中包含其他主机的主机名,并且-例如-在发送大量消息/图像/任何内容时向每个主机广播。

    主机.属性

    然而,我找不到正确的方法来实现这一点。我尝试过启动不同的线程,每个线程都在已知的IP地址范围内搜索其他主机。类似这样的内容(为了可读性而简化):

    /** HostsLocator */
    public static void searchForHosts(boolean waitToEnd) {
        for (int i=0; i < MAX_IP; i+= MAX_IP / threads) {
            HostsLocator detector = new HostsLocator(i, i+(MAX_IP / threads - 1)); // range: from - to
            new Thread(detector).start();                 
        }
    }
    
    public void run() {
        for (int i=from; i<=to; i++)
            findHosts( maskAddress + Integer.toString(i) );
    }
    
    public static boolean findHosts(String IP) {
        InetAddress address = InetAddress.getByName(IP);
        if ( address.isReachable(CONNECTION_TIME_OUT) )
            // host found!
    }
    

    • 只有一个线程和一个低值 连接\u超时\u 找不到主机 实际活动主机的状态。
    • 具有很高的 (5000ms)并且只有一个线程永远结束

    所以。。。我想有更好的办法解决这个问题,但我找不到。有什么建议吗?谢谢!

    6 回复  |  直到 15 年前
        1
  •  6
  •   filip-fku    15 年前

        2
  •  2
  •   krock    15 年前

    你可以更容易地使用 UDP Check this tutorial 例如。

        3
  •  2
  •   Thorbjørn Ravn Andersen    14 年前

    使用Bonjour/Zeroconf。

    The jmdns project 有你需要的一切。

        4
  •  1
  •   mtk    13 年前

    要在java中查找lan中的所有主机,请从java执行命令并将结果添加到 JList

    下面是一个小代码,它可以帮助你在windows中读取局域网中的所有主机。还有其他操作系统的命令请看下面的代码

    try {
    
        Runtime rt = Runtime.getRuntime();
        FileWriter write=new FileWriter("mylist.txt");
        BufferedWriter writer=new BufferedWriter(write);
        Process pr = rt.exec("net view");
    
        BufferedReader input = new BufferedReader(new InputStreamReader(pr.getInputStream()));
    
        String line=null;
        String hosts="";
        while((line=input.readLine()) != null) {
            Thread.sleep(100);
            if((!(line.equals("")))&&(!(line.equalsIgnoreCase("Server Name            Remark")))&&(!(line.equalsIgnoreCase("-------------------------------------------------------------------------------")))&&(!(line.equalsIgnoreCase("The command completed successfully.")))) 
            {
                line=line.replace('\\',' ');
                line=line.trim();
                listModel.addElement(line);
                hosts=hosts+line.trim()+",";
                hosts=hosts.trim();
            }
        }
        writer.write(hosts);
        writer.close();
        } catch(Exception e) {
            System.out.println(e.toString());
            e.printStackTrace();
        }
    
        5
  •  0
  •   bwawok    15 年前

    每隔这么多分钟,向每个已知主机发送一个所有已知主机的列表。

    那边


    b) 一个新的主机将遍布网络

    一个主机在一周内看不到,或者从一个新的IP上看不到,就会从更新的IP列表中删除。

        6
  •  0
  •   Steven Schlansker    15 年前