2012-04-09 13 views
6

अपने आवेदन में मैं एक datagarm सॉकेट बनाया है और एक बंदरगाह आबद्ध hyave 9999 कहना 192.168.173.1 आईपी के लिए अब मैं एक नया आईपी के लिए बंदरगाह के लिए बाध्य करना चाहते हैं पर आंकड़ारेख सॉकेट करने के लिए एक बंदरगाह rebinding कहना 192.168.173.2 लेकिन मैं मैं का पालनएक difftent आईपी

1 DatagramSocket s= new DatagramSocket(port,ip1); 
2 s.disconnect(); 

s.close(); 

s= new DatagramSocket(port,ip2); 

यह कदम ऐसा करने में सक्षम नहीं कर रहा हूँ, लेकिन यह एक

java,net,BindException :Address already in use : Cannot bind 

किसी भी अंतर्दृष्टि बहुत मददगार होगा देता है।

+0

आप जांच की है निम्नलिखित: 1. पोर्ट 9999 IP2 पर नि: शुल्क है, 2. IP2 3. यदि आप IP2 पर पहुंचने की अनुमति pingable है। – NiranjanBhat

उत्तर

7

अनबिंड करने और पुनर्निर्मित करने का प्रयास करते समय अपवादों से बचने के लिए, आप प्रत्येक निर्मित सॉकेट को पुन: प्रयोज्य के रूप में सेट करेंगे।

DatagramSocket s = new DatagramSocket(null); 
s.setReuseAddress(true); 
s.bind(someSocketAddress); 

और जानकारी:: http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html#setReuseAddress(boolean)

पी.एस. ऐसा करने में, आप एक अनबाउंड सॉकेट बनाने चाहिए टीसीपी का उपयोग करते समय ऐसी परिस्थितियों में बाइंडएक्सप्शन का मुख्य कारण टाइमआउट अवधि यूडीपी सॉकेट पर लागू नहीं हो सकता है, लेकिन SO_REUSE को आपको तुरंत वैसे भी पुनर्विचार करने की अनुमति देनी चाहिए।

final int port = 55880; 

ए) कोई पुन: उपयोग, कोई करीबी = पहले से प्रयोग में

DatagramSocket s = new DatagramSocket(null); 
s.bind(new InetSocketAddress("127.0.0.1", port)); 

s = new DatagramSocket(null); 
s.setReuseAddress(true); 
s.bind(new InetSocketAddress("localhost", port)); 

बी) पुन: उपयोग, कोई करीबी = कोई शिकायत नहीं

पता: http://docs.oracle.com/javase/7/docs/api/java/net/DatagramSocket.html#setReuseAddress(boolean)

यहाँ कुछ उदाहरण हैं

DatagramSocket s = new DatagramSocket(null); 
s.setReuseAddress(true); 
s.bind(new InetSocketAddress("127.0.0.1", port)); 

s = new DatagramSocket(null); 
s.setReuseAddress(true); 
s.bind(new InetSocketAddress("localhost", port)); 

सी) कोई पुन: उपयोग नहीं, बंद = कोई शिकायत नहीं (डेटाग्राम सॉकेट के लिए केवल तभी)

DatagramSocket s = new DatagramSocket(null); 
s.bind(new InetSocketAddress("127.0.0.1", port)); 
s.close(); 

s = new DatagramSocket(null); 
s.bind(new InetSocketAddress("localhost", port)); 
s.close(); 
+0

यह काम नहीं करता है मैंने सॉकेट पुन: उपयोग को सत्य के रूप में सेट किया है लेकिन एक ही अपवाद फिर से ऊपर उठता है – cornercoder

+0

यदि उस विशिष्ट बंदरगाह पर बांधने वाले सभी सॉकेट पुन: प्रयोज्य हैं, तो आपको बाध्य अपवाद नहीं मिल सकता है। – afk5min

+0

केवल एक बंदरगाह है और मुझे – cornercoder

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