2010-06-16 3 views
6

में एक लैन में गतिशील रूप से अन्य होस्ट ढूंढें कुछ समय पहले मैंने थोड़ा लैन चैट ऐप विकसित किया था। जावा में जो अन्य होस्टों के साथ चैट करने, इमेज भेजने इत्यादि की इजाजत देता है। हालांकि यह सिर्फ मजेदार के लिए बनाया गया था, अब इसका इस्तेमाल किया जा रहा है जहां मैं काम करता हूं।जावा

वर्तमान में, ऐप पर "चैट सर्वर" कोई नहीं है। जहां प्रत्येक ग्राहक पंजीकृत होता है, इसकी स्थिति अपडेट करता है, आदि (मुझे सममित डिजाइन का विचार पसंद आया और किसी अन्य मशीन पर चल रहे सर्वर के आधार पर नहीं)।

इसके बजाय, प्रत्येक मेजबान जो एक hosts.properties अन्य सेनाओं के होस्ट नाम के साथ फ़ाइल है एक क्लाइंट/सर्वर है, और - उदाहरण के लिए - जब भेजने उनमें से हर एक के लिए एक बड़े पैमाने पर प्रसारण संदेश/छवि/जो कुछ भी ।

शुरुआत में केवल कुछ मेजबान थे, इसलिए यह host.properties फ़ाइल कोई समस्या नहीं थी। लेकिन चूंकि उपयोगकर्ताओं की संख्या में वृद्धि हुई, उस फ़ाइल को अपडेट करने की आवश्यकता थोड़ा मुश्किल थी। तो अब मैंने इसे छुटकारा पाने का फैसला किया है, और हर बार ऐप। शुरू होता है, अन्य सक्रिय मेजबान गतिशील रूप से पाते हैं।

हालांकि, मुझे इसे लागू करने का सही तरीका नहीं मिल रहा है। मैंने अलग-अलग थ्रेड शुरू करने का प्रयास किया है, उनमें से प्रत्येक आईपी पते की एक ज्ञात श्रृंखला में अन्य होस्टों की तलाश में है। कुछ इस तरह (पठनीयता के कारण सरलीकृत):

/** 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) और केवल एक एकल थ्रेड में एक उच्च मूल्य के साथ समाप्त करने के लिए
  • कई धागे के साथ
  • हमेशा के लिए ले जाता है मैं भी टकराव के कारण पहले एक तरह इसी तरह की समस्याओं, मिल गया है।

तो ... मुझे लगता है कि इस समस्या को हल करने का एक बेहतर तरीका है लेकिन मुझे यह नहीं मिला। कोई सलाह? धन्यवाद!

+0

भी http://stackoverflow.com/questions/1233204 देखें – trashgod

+0

आप परियोजना "गुस्सा आईपी स्कैनर" स्रोत फोर्ज में के लिए स्रोत कोड की जांच कर सकता पर नज़र रखना। http://www.angryip.org/w/ विकास –

उत्तर

5

आप एक विशिष्ट करने के लिए यूडीपी प्रसारण की कोशिश कर सकते बंदरगाह। नेटवर्क पर आपके ऐप के सभी चल रहे उदाहरण उस बंदरगाह को सुन सकते हैं और फिर मेजबान के रूप में पहचानने वाले संदेश के साथ जवाब दे सकते हैं।

+1

+1 - यह लगभग समान है कि एआरपी प्रोटोकॉल कैसे काम करता है। –

+0

प्रसारण के साथ समस्या यह है कि एक बदलाव है कि एक अन्य कार्यक्रम या सेवा बंदरगाह पर चल रही हो सकती है कि प्रोग्राम चालू होगा। –

0

प्रत्येक होस्ट उन सभी होस्टों का ट्रैक रखता है जो वे मिले हैं। जब आप बंद करते हैं, तो ज्ञात होस्ट को अगली बार फ़ाइल शुरू करने और पुन: उपयोग करने के लिए सहेजें।

हर इतने सारे मिनट, ज्ञात मेजबानों को सभी ज्ञात मेजबानों की एक सूची भेजें।

इस तरह

एक) कोई नेटवर्क स्कैनिंग
ख) जब एक नया मेजबान मिलती है एक नया मेजबान

फिर नेटवर्क के चारों ओर फैल जाएगा, वह सिर्फ हर किसी के बारे में जानने के 1 अन्य मेजबान के लिए ज़रूरी है ।

एक होस्ट जो एक सप्ताह के लिए नहीं देखा जाता है, या किसी नए आईपी से देखा जाता है उसे अद्यतन की सूची से हटा दिया जाता है।

2

आप UDP का उपयोग करके यह बहुत आसान कर सकते हैं। उदाहरण के लिए Check this tutorial

0

आप का उपयोग करने के DNS service discovery

वहाँ एक परियोजना on sourceforge हो रहा है प्रयास कर सकता है (कि मैं, को देखा नहीं किया है एक सरसरी खोज कर रही परे ...)

2

बोनजोर/ज़ीरोकॉन्फ़ का उपयोग करें।

The jmdns project आपको बस इतना ही चाहिए।

1

जावा में लैन में सभी मेजबानों खोजने जावा से आदेश पर अमल और JList

लिए परिणाम जोड़ने के यहाँ छोटा सा कोड आप करने में मदद मिलेगी कि खिड़कियों में लैन में सभी मेजबानों को पढ़ने के लिए वहाँ के लिए अन्य आदेशों हो जाएगा के लिए अन्य ओएस निम्नलिखित कोड

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(); 
    }