gpt4 book ai didi

java - 用Java动态查找局域网中的其他主机

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:00:38 27 4
gpt4 key购买 nike

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

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

相反,每个主机都是一个客户端/服务器,它有一个包含其他主机主机名的 hosts.properties 文件,并且 - 例如 - 在发送大量消息时向每个主机广播/图片/随便。

一开始只有几个主机,所以这个 hosts.properties 文件不是问题。但随着用户数量的增加,更新该文件的需求有点令人望而生畏。所以现在我决定摆脱它,每次应用程序。开始,动态地找到其他 Activity 主机。

但是,我找不到实现它的正确方法。我试过启动不同的线程,每个线程都在已知 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!
}

但是:

  • 使用单线程和较低的 CONNECTION_TIME_OUT 值(500 毫秒),我得到错误的 Host Not Found 状态,表示主机实际处于 Activity 状态。
  • CONNECTION_TIME_OUT 的值很高(5000 毫秒)并且只有一个线程永远结束
  • 对于多个线程,由于冲突,我还发现了与第一个类似的问题。

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

最佳答案

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

关于java - 用Java动态查找局域网中的其他主机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3050221/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com