2011-11-26 12 views
5

द्वारा होस्ट खोजें I जावा/एंड्रॉइड ऐप है जिसे स्थानीय नेटवर्क पर सर्वर पर कुछ डेटा भेजने की आवश्यकता है। समस्या यह है कि सर्वर का आईपी पता गतिशील है इसलिए इसे खोजने का एकमात्र तरीका इसके मैक पते से दिखता है। क्या जावा में यह संभव है? क्या आप कोई अन्य विकल्प देख सकते हैं?जावा - मैक पते

+0

संशोधित दिनचर्या मैं अपने संदेह एक मैक है पता लुकअप संभव होगा, लेकिन आप होस्ट नाम से कनेक्ट नहीं कर सकते? तो '74.125.237.116' के अंत में, आप' www.google.com' से कनेक्ट होंगे। –

उत्तर

0

क्या यह जावा में संभव है?

शुद्ध जावा में नहीं।

ऐसी कोई सेवा नहीं है जो सीधे आईएसी पते पर मैक पते को मानचित्र करे। मैक पते पर आईपी पते मैप करने के लिए आपके मेजबान कंप्यूटर के ऑपरेटिंग सिस्टम का नेटवर्क स्टैक एआरपी प्रोटोकॉल और (लिनक्स/यूनिक्स पर) ARP daemon का उपयोग करता है। AFAIK, जावा से एआरपी प्रोटोकॉल का उपयोग करना संभव नहीं है।

सबसे अच्छा आप (लिनक्स पर) बाहरी आदेश के रूप में "arpd -l" चलाने के लिए कर सकते हैं। यह डेमॉन के एआरपी मैपिंग को एक अच्छी तरह से परिभाषित प्रारूप में डंप करेगा कि आपका जावा ऐप पढ़ और पार्स कर सकता है। यदि आपका सर्वर स्थानीय नेटवर्क पर सक्रिय है, तो इसका मैक पता संबंधित आईपी पते के साथ दिखाई देगा। लेकिन अगर यह स्थानीय नेटवर्क पर नहीं है तो उसके एआरपी प्रसारण आपकी मशीन तक नहीं पहुंचेंगे, इसलिए डेमॉन टेबल में प्रवेश नहीं होगा।


अपने सर्वर को एक स्थिर आईपी पता ... और एक DNS पता असाइन करना बेहतर होगा। एक अन्य संभावना यह होगी कि सर्वर Dynamic DNS सेवा का उपयोग कर स्वयं पंजीकृत हो।

+0

आप इसे मैक 'NetworkInterface.getHardwareAddress() 'से पूछताछ करते हुए प्रसारण के माध्यम से कर सकते हैं और यह जांच कर सकते हैं कि यह मानदंड से मेल खाता है या नहीं, यानी सर्वर को सहकारी होना चाहिए। एंड्रॉइड डिवाइस वास्तव में प्रसारित कर सकता है तो यह एक और कहानी है। – bestsss

+0

@bestsss - शायद यह काम नहीं करेगा। नियमित एआरपी में, आप आईपी पता प्रसारित करते हैं और मैक पते वापस लेते हैं। जब तक सर्वर इनवर्क्स एआरपी लागू नहीं करता - http://tools.ietf.org/html/rfc2390 - आप किसी मैक पते के लिए आईपी पते का अनुरोध नहीं कर सकते हैं। –

+0

मेरा मतलब है एक नियमित प्रसारण जिसमें मैक को पेलोड के रूप में शामिल किया गया है और सर्वर प्रसारण को जवाब देगा बशर्ते वह उस मैक (इसलिए सहकारी) पर शुरू किया गया हो। बस खोज एक दूसरे पर हालांकि एक क्रूर दृष्टिकोण भी कर सकता है, बस पोर्ट स्कैनर जैसे नेटवर्क में सभी आईपी को भेजें। – bestsss

2

मैक पते द्वारा होस्ट ढूँढना केवल आपके स्थानीय नेटवर्क में काम कर सकता है। मैक पते आईपी एड्रेस के तहत एक परत हैं। मैक एड्रेस के आधार पर अन्य नेटवर्क पर कोई रूटिंग मौजूद नहीं है।

प्रसारण/मल्टीकास्ट

आप एक समाधान है जो केवल स्थानीय नेटवर्क में काम करता है, पर सुनने और प्रसारित करने के लिए या बहुस्त्र्पीय आप के लिए एक विकल्प हो सकता भेजने के लिए देख रहे हैं। यदि आप किसी प्रसारण पते पर एक पैकेट भेजते हैं, तो स्थानीय नेटवर्क में प्रत्येक होस्ट को यह पैकेट प्राप्त होता है और यदि वह सर्वर है जिसे आप ढूंढ रहे हैं तो इसका उत्तर दे सकता है। मल्टीकास्ट में स्पष्ट रूप से भिन्नता है, कि केवल वे होस्ट जो पैकेट प्राप्त करना चाहते हैं जिन्हें विशिष्ट मल्टीटास्ट पते पर संबोधित किया जाता है, यह पैकेट प्राप्त करते हैं। यदि आप मल्टीकास्ट का उपयोग कर रहे हैं तो आपको अपने आवेदन के लिए एक पता चुनना होगा, प्रत्येक ग्राहक इस पते पर पैकेट भेजता है, हर कोई इस पते पर सर्वर सुनता है। यहां तक ​​कि कुछ नेटवर्क भी मौजूद हैं (उदाहरण के लिए कुछ विश्वविद्यालय नेटवर्क), जहां मल्टीकास्ट पैकेट अन्य स्थानीय नेटवर्क के सीमित सेट पर जाते हैं।

DNS या अन्य स्थिर सर्वर

आप जो आप अपने गतिशील serevr लगाने के लिए प्रयोग कर एक स्थैतिक आईपी पते के साथ एक दूसरे सर्वर इस्तेमाल कर सकते हैं। आपका डायनामिक सर्वर आपके स्थिर सर्वर को जब भी यह बदलता है तो उसका आईपी पता बताएगा। आप क्लाइंट गतिशील सर्वर के पते के लिए स्थिर सर्वर से पूछेंगे। यह पैटर्न पूरे इंटरनेट पर काम करता है, नामांकन जहां आपका गतिशील सर्वर और ग्राहक हैं।

यह स्थिर सर्वर आपका DNS सर्वर या कुछ dyndns प्रदाता का डीएनएस सर्वर हो सकता है। लेकिन यह DNS तक ही सीमित नहीं है। DNS को सेवाओं/सर्वर तक पहुंचने के तरीके के बारे में जानने के लिए डिज़ाइन किया गया है, लेकिन यह किसी भी प्रोटोकॉल पर किया जा सकता है। उदाहरण के लिए यदि आप वेबसाइसेस पसंद करते हैं तो यह आपके द्वारा विकसित कुछ http/वेब एप्लिकेशन पर किया जा सकता है।

2

बस एक छोटे से चेतावनी: इस कोड अपरीक्षित है,

तो जैसे एआरपी कैश की खुदाई की कोशिश करें,:

public static String getIpFromArpCache(String macaddr) { 
    if (ip == null) 
     return null; 
    BufferedReader br = null; 
    try { 
     br = new BufferedReader(new FileReader("/proc/net/arp")); 
     String line; 
     while ((line = br.readLine()) != null) { 
      String[] splitted = line.split(" +"); 
      if (splitted != null && splitted.length >= 4 && macaddr.equals(splitted[3])) { 
       // Basic sanity check 
       String ip = splitted[0]; 
       if (validateIp(ip)) { 
        return ip; 
       } else { 
        return null; 
       } 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      br.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    return null; 
} 

private static final String PATTERN = 
    "^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." + 
    "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." + 
    "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." + 
    "([01]?\\d\\d?|2[0-4]\\d|25[0-5])$"; 

public static boolean validateIp(final String ip){   

     Pattern pattern = Pattern.compile(PATTERN); 
     Matcher matcher = pattern.matcher(ip); 
     return matcher.matches();    
} 

से here

+0

इसका मतलब यह नहीं है कि मैक स्थानीय कैश में होगा। इसलिए कुछ मामलों में यह काम कर सकता है लेकिन यह भी नहीं हो सकता है। – bestsss

+0

मुझे पता है, आप सही हैं, शायद इसे करने से पहले उन्हें एक मल्टीकास्ट करना होगा। मैं सप्ताहांत के बाद इसका परीक्षण करूंगा और उत्तर अपडेट करूँगा। – Reno

संबंधित मुद्दे