2011-03-18 14 views
7

पृष्ठभूमि: मैं एक बीटा सर्वर पिंग करने के लिए एक साधारण यूडीपी अनुप्रयोग लिख रहा हूं जिसे मैं हर मिनट या तो प्रबंधित करता हूं ताकि मुझे यह बताने के लिए कि यह अभी भी ऊपर है और चल रहा है (मैं कर सकता हूं ' उन लोगों के लिए सर्वर पर पिंग सक्षम करें जो सोच रहे हैं)। जब मैं सर्वर का जवाब नहीं दे रहा हूं तो मुझे चेतावनी देने के लिए मैं अपने फोन पर इसे चलाने की योजना बना रहा हूं।एंड्रॉइड: java.net.DatagramSocket.bind: अमान्य तर्क अपवाद

मैं जैसे प्रतीत होता है सरल java.net.DatagramSocket उपयोग करने के लिए कोशिश कर रहा हूँ:

try 
    { 
     socket = new DatagramSocket(); 
     socket.bind(null); 
    } 
    catch (SocketException e) 
    { 
     System.out.println(e.toString()); 
     throw e; 
    } 

भी मुझे चलो कहना है कि मैं एंड्रॉयड प्रकट के माध्यम से इंटरनेट अनुमतियों सक्षम किया है और अगर मैं का उपयोग करता है खंड को दूर ऐसा करने के लिए, मुझे अनुमति त्रुटियां मिलती हैं इसलिए मुझे यकीन है कि ठीक काम कर रहा है। जब मैं एंड्रॉइड वर्चुअल डिवाइस (एवीडी) में यह कोड डाउनलोड करता हूं और इसे निष्पादित करता हूं, कॉल करने के लिए कॉल पर() मुझे इस अपवाद के साथ प्रस्तुत किया जाता है:

03-17 19: 07: 39.401: INFO/System.out (338): java.net.BindException: अमान्य तर्क

this प्रलेखन के अनुसार, शून्य तर्क सही है:

सार्वजनिक शून्य बाँध (SocketAddress localAddr)

के बाद से: एपीआई स्तर 1

स्थानीय सॉकर द्वारा निर्दिष्ट स्थानीय पते और पोर्ट पर इस सॉकेट को बांधता है। यदि यह मान शून्य है तो किसी मान्य स्थानीय पते पर कोई भी निःशुल्क पोर्ट उपयोग किया जाता है।

लेकिन प्रलेखन पर भरोसा नहीं, मैं इस तरह अपने डिवाइस पर आई पी पतों की गणना करने का निर्णय लिया:

ArrayList<NetworkInterface> allInterfaces = Collections.list(NetworkInterface.getNetworkInterfaces()); 

    NetworkInterface eth = allInterfaces.get(0); 

    InetSocketAddress addr = new InetSocketAddress(eth.getInetAddresses().nextElement(), port); 

    try 
    { 
     socket = new DatagramSocket(); 
     socket.bind(addr); 
    } 
    catch (SocketException e) 
    { 
     System.out.println(e.toString()); 
     throw e; 
    } 

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

+0

पोर्ट नंबर? क्या यह वैध सीमा के भीतर है? –

+0

विभिन्न पोर्ट नंबर के साथ प्रयास करें। –

उत्तर

9

[संपादित: यदि आप मेरे पिछले प्रतिक्रिया देखा मैं एक परीक्षण में दो चर बदलने की क्लासिक डिबगिंग गलती की है और यह अन्य एक है कि मेरी समस्या हल किया गया था।]

मैं इस समस्या पाया। जिस तरह से मैं डेटाग्राम सॉकेट घोषित कर रहा हूं जो समस्याओं का कारण बनता है। यदि मैं डेटाग्राम सॉकेट को निम्न तरीके से खोलने के लिए डेटाग्राम चैनल का उपयोग करता हूं तो बाध्य() कॉल सफल होता है।

 DatagramChannel channel = DatagramChannel.open(); 
     DatagramSocket socket = channel.socket(); 
+0

कोई विचार क्यों नहीं, लेकिन यह मेरे लिए भी काम करता था। –

+3

नया डेटाग्राम सॉकेट (शून्य); –

2

मैं या तो इस समस्या भर में ठोकर खाई है और कारण मिल गया है: अगर आप parameterless निर्माता new DatagramSocket() कहते हैं, यह बनाता है "एक यूडीपी आंकड़ारेख सॉकेट जो स्थानीय मेजबान पर किसी भी उपलब्ध पोर्ट के लिए बाध्य है का उपयोग करते हुए एक वाइल्डकार्ड पता "(एपीआई दस्तावेज़ों के अनुसार)। तो इसका वास्तव में मतलब है, सॉकेट पहले से ही बाध्य है।

 SocketAddress socketAddress = new SocketAddress(yourInetAddress, yourPort); 
     DatagramSocket serverSocket = new DatagramSocket(null); 
     serverSocket.bind(socketAddress); 

यह स्पष्ट रूप से एक अबाध सॉकेट (DatagramSocket (SocketAddress localAddr) निर्माता के माध्यम से) बनाता है, जिसे बदले में सॉकेट बाध्य करने के लिए संभव बनाने: मेरी इस बात के लिए "ठीक" इस प्रकार है।

यह शायद एक अनावश्यक चैनल बनाने से अधिक सुंदर समाधान है।

पी.एस .: अजीब पर्याप्त, यह वह जगह है जहां DatagramSocket एक टीसीपी ServerSocket से अलग है: बाद के parameterless निर्माता एक अबाध ServerSocket पैदा करेगा, इस समस्या को ट्रिगर नहीं कर रहा।

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