2008-09-22 10 views
10

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

+0

खैर, विशेषाधिकार रहित उपयोगकर्ताओं के लिए यह पहले से ही> 1024 * nix पर ही सीमित है: पी – freespace

+0

दुर्भाग्य से हम खिड़कियों पर चल रहे हैं;) –

उत्तर

7

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

मैं, इस उत्तर के बारे में असहज कर रहा हूँ, क्योंकि यह असजीला है ..., फिर भी मैं वास्तव में कुछ और भी नहीं पा सकते हैं: (आमतौर पर) एक की सुविधा/

+2

तुम भी नोट करना चाहिए कि कभी-कभी एक मुफ्त बंदरगाह के लिए रैखिक खोज करने में सुरक्षा प्रभाव पड़ता है। यदि आप क्लाइंट 1 के लिए पोर्ट ए का उपयोग करते हैं, और अगले क्लाइंट के लिए पोर्ट ए + 1 का उपयोग करते हैं तो क्लाइंट 1 उस पोर्ट को अनुमान लगा सकता है जिसे आप किसी अन्य क्लाइंट के लिए उपयोग करने जा रहे हैं। – Darron

2

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

यदि नियमित क्षणिक बाध्यकारी व्यवहार आपकी आवश्यकताओं के अनुरूप नहीं है, तो आपको शायद Socket.bind() का उपयोग करके अपना खुद का लिखना होगा।

0

आप जावा कोड पर नज़र डाल सकते हैं जो आपके द्वारा उपयोग किए जा रहे कार्यों को लागू करता है। अधिकांश जावा पुस्तकालय जावा में लिखे गए हैं, इसलिए आप देख सकते हैं कि आपको वहां क्या चाहिए।

मान लीजिए @ केनस्टर सही था और यह एक सिस्टम ऑपरेशन है, आपको बस प्रत्येक को बांधने या परीक्षण करने की कोशिश कर रहे बंदरगाहों पर फिर से प्रयास करना पड़ सकता है। हालांकि यह थोड़ा दर्दनाक है, यह कोड की कुछ पंक्तियों से अधिक नहीं होना चाहिए।

1

यहाँ कोड की जरूरत है:

public static Socket getListeningSocket() { 
    for (int port = MIN_PORT ; port <= MAX_PORT ; port++) 
    { 
     try { 
      ServerSocket s = new ServerSocket(port); 
      return s;  // no exception means port was available 
     } catch (IOException e) { 
      // try the next port 
     } 
    } 
    return null; // port not found, perhaps throw exception? 
} 
+3

आपको BindException को पकड़ना चाहिए, जो बंदरगाह पहले से उपयोग में आने पर लॉन्च किया गया है। – Chochos

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