【发布时间】:2010-06-16 01:49:39
【问题描述】:
不久前,我开发了一个小型局域网聊天应用程序。在 Java 中,它允许与其他主机聊天、发送图像等。虽然它只是为了好玩而创建的,但现在它正在我工作的地方使用。
目前,应用上没有“聊天服务器”。每个客户端在哪里注册,更新它的状态等(我喜欢对称设计的想法,而不是依赖于在其他机器上运行的服务器)。
相反,每个主机都是一个客户端/服务器,它有一个 hosts.properties 文件,其中包含其他主机的主机名,并且 - 例如 - 在发送大量消息时向每个主机广播/image/随便。
一开始只有几个主机,所以这个 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(500 毫秒)中的低值,对于实际处于活动状态的主机,我得到错误的 Host Not Found 状态。
- CONNECTION_TIME_OUT (5000ms) 的值很高,并且只有一个线程需要永远结束
- 由于冲突,我还发现了与第一个线程类似的问题。
所以...我想有更好的方法来解决这个问题,但我找不到。有什么建议吗?谢谢!
【问题讨论】:
-
您可以在 Source Forge 查看“愤怒的 IP 扫描仪”项目的源代码。 angryip.org/w/Development
标签: java networking chat