在Java中动态查找LAN中的其他主机

在Java中动态查找LAN中的其他主机,java,networking,chat,Java,Networking,Chat,不久前,我开发了一个小型局域网聊天应用程序。在Java中,它允许与其他主机聊天、发送图像等。虽然它只是为了好玩而创建的,但现在它在我工作的地方被使用 目前,该应用程序上没有“聊天服务器”。每个客户端注册、更新其状态等(我喜欢对称设计的思想,不依赖于在其他机器上运行的服务器) 相反,每台主机都是一台客户机/服务器,它有一个带有其他主机主机名的hosts.properties文件,例如,在发送大量消息/图像/任何内容时向每台主机广播 起初只有几个主机,所以这个hosts.properties文件不是

不久前,我开发了一个小型局域网聊天应用程序。在Java中,它允许与其他主机聊天、发送图像等。虽然它只是为了好玩而创建的,但现在它在我工作的地方被使用

目前,该应用程序上没有“聊天服务器”。每个客户端注册、更新其状态等(我喜欢对称设计的思想,不依赖于在其他机器上运行的服务器)

相反,每台主机都是一台客户机/服务器,它有一个带有其他主机主机名的hosts.properties文件,例如,在发送大量消息/图像/任何内容时向每台主机广播

起初只有几个主机,所以这个hosts.properties文件不是问题。但随着用户数量的增加,更新该文件的需求有点令人望而生畏。所以现在我决定把它扔掉,每次都是应用程序。启动,动态查找其他活动主机

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

/**HostsLocator*/
公共静态void searchForHosts(布尔waitToEnd){
对于(int i=0;i对于(int i=from;i每个主机都会跟踪它们遇到的所有主机。关闭时,将已知主机保存到文件中,并在下次启动时重新使用

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

那样

a) 无网络扫描
b) 一个新的主机将遍布网络

然后,当一个新的主持人加入时,他只需要知道另外一个主持人就可以了解每个人


一周内看不到或从新IP看到的主机将从更新列表中删除。

您可以更轻松地使用它。例如。

您可以尝试使用


似乎有一个项目(除了进行粗略搜索之外,我还没有看过…)

您可以尝试将UDP广播到特定端口。网络上所有正在运行的应用程序实例都可以侦听该端口,然后用一条消息响应,将其标识为主机。

使用Bonjour/Zeroconf


拥有您所需的一切。

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

下面是一个小代码,它将帮助您在windows中读取lan中的所有主机。其他操作系统将有其他命令。请查看以下代码

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();
    }

另请参阅,您可以在source Forge上查看项目“Angry IP scanner”的源代码。+1-这大致类似于ARP协议的工作方式。广播的问题是,该程序将侦听的端口上可能正在运行另一个程序或服务。
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();
    }