Cách đây một thời gian, tôi đã phát triển một ứng dụng trò chuyện mạng LAN nhỏ. trong Java cho phép trò chuyện với các máy chủ khác, gửi hình ảnh, vv Mặc dù nó được tạo ra chỉ để cho vui, bây giờ nó đang được sử dụng nơi tôi làm việc.Tự động tìm các máy chủ khác trong một mạng LAN trong Java
Hiện tại, không có "máy chủ trò chuyện" trên ứng dụng. nơi mỗi khách hàng đăng ký, cập nhật trạng thái của nó, v.v. (Tôi thích ý tưởng thiết kế đối xứng và không phụ thuộc vào máy chủ đang chạy trên một số máy khác). Thay vào đó, mỗi máy chủ là một máy khách/máy chủ có một máy chủ lưu trữ hosts.properties với tên máy chủ của các máy chủ khác và - ví dụ - phát sóng cho từng người trong số họ khi gửi một tin nhắn/hình ảnh lớn/bất cứ điều gì .
Ban đầu chỉ có một vài máy chủ, do đó, tệp này hosts.properties không phải là vấn đề. Nhưng khi lượng người dùng tăng lên, nhu cầu cập nhật tệp đó hơi khó khăn. Vì vậy, bây giờ tôi đã quyết định để thoát khỏi nó, và mỗi lần ứng dụng. bắt đầu, tìm kiếm động các máy chủ đang hoạt động khác.
Tuy nhiên, tôi không thể tìm được cách thực hiện chính xác điều này. Tôi đã thử bắt đầu các chủ đề khác nhau, mỗi một trong số họ tìm kiếm các máy chủ khác trong một dải địa chỉ IP đã biết. Một cái gì đó như thế này (giản thể vì lợi ích của khả năng đọc):
/** 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!
}
Tuy nhiên:
- Với một chủ đề duy nhất và một giá trị thấp trong CONNECTION_TIME_OUT (500ms) tôi nhận được sai chủ Not Found trạng thái cho các máy chủ thực sự hoạt động.
- Với một giá trị cao trong CONNECTION_TIME_OUT (5000ms) và chỉ có một chủ đề duy nhất sẽ mãi mãi để chấm dứt
- Với nhiều chủ đề Tôi cũng thấy vấn đề tương tự như người đầu tiên, do va chạm.
Vì vậy ... Tôi đoán có cách tốt hơn để giải quyết vấn đề này nhưng tôi không thể tìm thấy. Lời khuyên nào? Cảm ơn!
Xem thêm http://stackoverflow.com/questions/1233204 – trashgod
Bạn có thể kiểm tra mã nguồn cho dự án "Máy quét IP tức giận" tại Source Forge. http://www.angryip.org/w/Development –