在Java中动态查找LAN中的其他主机
不久前,我开发了一个小型局域网聊天应用程序。在Java中,它允许与其他主机聊天、发送图像等。虽然它只是为了好玩而创建的,但现在它在我工作的地方被使用 目前,该应用程序上没有“聊天服务器”。每个客户端注册、更新其状态等(我喜欢对称设计的思想,不依赖于在其他机器上运行的服务器) 相反,每台主机都是一台客户机/服务器,它有一个带有其他主机主机名的hosts.properties文件,例如,在发送大量消息/图像/任何内容时向每台主机广播 起初只有几个主机,所以这个hosts.properties文件不是问题。但随着用户数量的增加,更新该文件的需求有点令人望而生畏。所以现在我决定把它扔掉,每次都是应用程序。启动,动态查找其他活动主机 但是,我找不到正确的实施方法。我尝试过启动不同的线程,每个线程在已知的IP地址范围内搜索其他主机。类似这样的内容(为了可读性而简化):在Java中动态查找LAN中的其他主机,java,networking,chat,Java,Networking,Chat,不久前,我开发了一个小型局域网聊天应用程序。在Java中,它允许与其他主机聊天、发送图像等。虽然它只是为了好玩而创建的,但现在它在我工作的地方被使用 目前,该应用程序上没有“聊天服务器”。每个客户端注册、更新其状态等(我喜欢对称设计的思想,不依赖于在其他机器上运行的服务器) 相反,每台主机都是一台客户机/服务器,它有一个带有其他主机主机名的hosts.properties文件,例如,在发送大量消息/图像/任何内容时向每台主机广播 起初只有几个主机,所以这个hosts.properties文件不是
/**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();
}