2012-11-04 11 views
8

मैं एक चैट एप्लिकेशन विकसित कर रहा हूं जहां एंड्रॉइड क्लाइंट मल्टीकास्टिंग (यूडीपी) का उपयोग करके अपने आईपी का आदान-प्रदान करेंगे।एंड्रॉइड डिवाइस मल्टीकास्ट पैकेज नहीं प्राप्त कर रहा है

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

// मल्टीकास्टिंग कोड।

DatagramSocket socket = new DatagramSocket(9898); 
      byte buff[] = ip.getBytes(); 
      DatagramPacket packet = new DatagramPacket(buff, buff.length, InetAddress.getByName("224.0.0.1"),9999); 
      socket.send(packet); 
      socket.close(); 

// रिसीवर कोड

MulticastSocket socket = new MulticastSocket(9999); 
     InetAddress group = InetAddress.getByName("224.0.0.1"); 
     socket.joinGroup(group); 

     DatagramPacket packet; 

      byte[] buf = new byte[256]; 
      byte b = 'x'; //just a separator for time being 
      Arrays.fill(buf,b); 
      packet = new DatagramPacket(buf, buf.length); 
      String received= ""; 
      while(received!=null) 
      { 
       socket.receive(packet); 
       received = new String(packet.getData()); 
       received = received.substring(0,received.indexOf('x')); 
       this.setIp(received); 
       System.out.println("Address: " + received); 
      } 

     socket.leaveGroup(group); 
     socket.close(); 

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

11-04 23:56:17.985: I/OSNetworkSystem(603): mcastAddDropMembership interfaceIndex=0 

किसी भी मदद की सराहना की जाएगी।

उत्तर

9

आपको अपने ऐप में MulticastLock प्राप्त करने की आवश्यकता है, जो आपके ऐप को ऐसे पैकेट प्राप्त करने की अनुमति देगा जो नेटवर्क पर इस डिवाइस को स्पष्ट रूप से संबोधित नहीं हैं।

अनुमति आवश्यक है:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> 
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 

नमूना कोड:

// Acquire multicast lock 
WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
MulticastLock multicastLock = wifi.createMulticastLock("multicastLock"); 
multicastLock.setReferenceCounted(true); 
multicastLock.acquire(); 

//Do some mutlicast job here 
... ... 

// Once your finish using it, release multicast lock 
if (multicastLock != null) { 
    multicastLock.release(); 
    multicastLock = null; 
} 
+0

यह इस तरह दिखता है केवल वाईफाई बहुस्त्र्पीय पैकेट के लिए है। मैं इंटरनेट पर मल्टीकास्टिंग कर रहा हूं (सामान्य एपीएन का उपयोग करके, कोई वाईफ़ाई नहीं)। क्या यह अभी भी काम करेगा? –

+0

मुझे नहीं लगता कि यह एंड्रॉइड पर संभव है, देखें कि क्या जवाब [यहां] (http://stackoverflow.com/questions/3068497/udp-multicast-over-the-internet) मदद करता है। – yorkw

+0

धन्यवाद मैं एक नज़र डालेगा। –

1

आईपीवी 4 एंड्रॉयड में बहुस्त्र्पीय समर्थन poorely कार्यान्वित किया जाता है। कपकेक युग से अभी भी मौजूद बग हैं।

मैं इसी तरह की समस्या में भाग गया, मैं एक ऐसी परियोजना कर रहा था जो सेवा खोज के लिए एमडीएनएस/मल्टीकास्ट पर निर्भर था। मेरा एंड्रॉइड ऐप मल्टीकास्ट समूह की सदस्यता नहीं लेगा। मैंने इसे उबंटू 14.04 मशीन पर एक पोर्टेबल एक्सेस पॉइंट बनाकर और उस पर टीसीपीडम्प चलाने के द्वारा सत्यापित किया। इससे जुड़े एंड्रॉइड डिवाइस बस समूह में शामिल होने के लिए आवश्यक आईजीएमपी संदेशों को उत्सर्जित नहीं करते थे। मैं पैकेट भेज सकता हूं लेकिन उन्हें प्राप्त नहीं कर सकता।

मैंने देखा कि जब भी मैं नेटवर्क में शामिल हुआ था, तो मुझे आईपीवी 6 समूह सिस्टम में सभी सिस्टम में शामिल हो रहा था। इसने मुझे आईपीवी 6 मल्टीकास्ट पते का प्रयास करने के लिए प्रेरित किया और यह काम किया।

नए एंड्रॉइड डिवाइस आईपीवी 6 का समर्थन करते हैं, जिसमें अंतर्निहित और अनिवार्य मल्टीकास्ट समर्थन है। तो कक्षा 4 आईपीवी 4 मल्टीकास्ट पते का उपयोग करने के बजाय, आईपीवी 6 पते का उपयोग करने के लिए अपने कोड को संशोधित करें। इससे आपका कोड कम से कम स्थानीय स्तर पर काम करेगा।

http://developer.android.com/reference/java/net/Inet6Address.html

यह पृष्ठ जानकारी के बारे में जो आईपी अपनी आवश्यकताओं के अनुसार उपयोग करने के लिए का खजाना है।

कुछ कहते हैं कि यह वाईफाईमेनगर.crrateMulticastLock() के बिना काम करता है लेकिन मैंने कोशिश नहीं की।

वैश्विक नेटवर्क पर मल्टीकास्टिंग निश्चित रूप से सैद्धांतिक रूप से संभव है। लेकिन मैंने कभी एक सफल व्यावहारिक कार्यान्वयन नहीं देखा है। आस-पास के रूटर और फ़ायरवॉल को देखते हुए जो आसपास मौजूद हैं।

यह SO प्रश्न दिखाता है कि यह डेस्कटॉप पर कैसे किया जाता है। इसी तरह का कोड एंड्रॉइड के साथ भी काम करता है।

IPv6 Multicast example