2010-06-16 29 views
6

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!

+0

Xem thêm http://stackoverflow.com/questions/1233204 – trashgod

+0

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 –

Trả lời

5

Bạn có thể thử UDP Broadcast để một cụ thể Hải cảng. Tất cả các phiên bản chạy ứng dụng của bạn trên mạng đều có thể nghe cổng đó và sau đó trả lời bằng một thông báo nhận dạng chúng là máy chủ lưu trữ.

+1

+1 - Điều này tương tự như cách thức hoạt động của giao thức ARP. –

+0

Vấn đề với phát sóng là có sự thay đổi một chương trình hoặc dịch vụ khác có thể đang chạy trên cổng mà (các) chương trình sẽ lắng nghe. –

0

Mỗi máy chủ lưu trữ theo dõi tất cả các máy chủ mà họ đã gặp. Khi bạn tắt, hãy lưu các máy chủ đã biết để gửi và sử dụng lại vào lần tiếp theo bạn khởi động.

Cứ sau một vài phút, gửi từng máy chủ đã biết danh sách tất cả các máy chủ đã biết.

Bằng cách đó

a) Không có mạng quét
b) Một máy chủ mới sẽ lan ra toàn mạng

Sau đó, khi một máy chủ mới tham gia, ông chỉ cần biết 1 máy chủ khác để tìm hiểu về tất cả mọi người .

Máy chủ không được xem trong một tuần hoặc được nhìn thấy từ một IP mới sẽ bị loại khỏi danh sách được cập nhật.

2

Bạn có thể thực hiện việc này dễ dàng hơn nhiều bằng cách sử dụng UDP. Check this tutorial để biết ví dụ.

0

Bạn có thể cố gắng sử dụng DNS service discovery

Dường như có một dự án on sourceforge (mà tôi đã không nhìn, ngoài làm một tìm kiếm lướt qua ...)

1

Đối với việc tìm kiếm tất cả các host trong lan trong java thực thi lệnh từ java và thêm kết quả để JList

Đây là đoạn mã nhỏ mà sẽ giúp bạn để đọc tất cả các host trong lan trong các cửa sổ sẽ có lệnh khác cho os khác xem mã sau đây

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(); 
    } 
Các vấn đề liên quan