当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用Java动态查找LAN中的其他主机》经验,为你挑选了1个好方法。

前段时间我开发了一个小的局域网聊天应用程序.在Java中允许与其他主机聊天,发送图像等.虽然它是为了娱乐而创建的,但现在它被用于我工作的地方.

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

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

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

但是,我找不到正确的实现方法.我尝试启动不同的线程,每个线程都在一个已知的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(500ms)中的单个线程和低值,我发现主机实际处于活动状态的主机未找到状态错误.

CONNECTION_TIME_OUT(5000ms)中的值很高,只有一个线程永远结束

由于碰撞,有几个线程我也发现了与第一个类似的问题.

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



1> filip-fku..:

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

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有