2010-02-09 16 views
7

जावा में, मुझे एक ही कार्यक्रम के कई उदाहरणों के बीच संचार के लिए एक पोर्ट नंबर पकड़ने की आवश्यकता है। अब, मैं बस कुछ निश्चित संख्या चुन सकता हूं और इसके साथ जाऊंगा। लेकिन मैं सोच रहा हूं कि पोर्ट नंबर को गतिशील रूप से चुनने का कोई तरीका है, ताकि मुझे पोर्ट नंबर सेट करने के साथ अपने उपयोगकर्ताओं को परेशान न करना पड़े।गतिशील रूप से पोर्ट नंबर चुनना?

यहाँ एक विचार मैं था, जो इस तरह काम करता है:

  • एक निश्चित प्रारंभिक पोर्ट संख्या ए
  • कार्यक्रम 'MyApp' शुरू होता है, बंदरगाह ए हड़पने के लिए
  • अगर यह सफल होता है की कोशिश करता है नहीं है , तो यह 'MyApp' का पहला उदाहरण है। किया हुआ।
  • यदि यह विफल हो जाता है, तो यह पोर्ट ए से पूछता है कि क्या ए पर प्रोग्राम 'MyApp' का उदाहरण है। यदि हां, उस उदाहरण के साथ संवाद करें। किया हुआ। यदि नहीं, तो पोर्ट ए + 1 को पकड़ने का प्रयास करें। और यदि उस बंदरगाह का उपयोग करने वाला कोई अन्य प्रोग्राम है (या तो 'MyApp' का उदाहरण नहीं है), तो ए + 2, फिर ए + 3, और इसी तरह से पकड़ें।

क्या यह रणनीति समझ में आती है? या क्या पोर्ट नंबर को गतिशील रूप से चुनने का एक बेहतर तरीका है?

+1

आपको ऐसा करने की आवश्यकता नहीं है। यदि आप सॉकेट बनाते हैं, तो सिस्टम स्वचालित रूप से आपके लिए अगले उपलब्ध पोर्ट नंबर को असाइन करता है। कृपया, सॉकेट एपीआई के लिए प्रलेखन सावधानी से पढ़ें जो आप उपयोग कर रहे हैं। प्रोग्रामिंग भाषा/लाइब्रेरी पर आप भी अधिक टैग प्रदान कर रहे हैं। –

+0

@dma_k: जावा में, जाहिर है कि आपको यह प्राप्त करने के लिए पोर्ट 0 से बांधना होगा (काउंटर-अंतर्ज्ञानी, मुझे पता है)। यदि आप बिल्कुल बंधे नहीं हैं, तो आप इसे सुनने में सक्षम नहीं होंगे। :-P –

+0

बहुत सारे सॉकेट कार्यान्वयन मुझे याद है कि इस "काउंटर-सहज" चाल का उपयोग गतिशील रूप से निर्दिष्ट पोर्ट के लिए पूछने के लिए किया जा सकता है ... यहां कुछ भी खास नहीं है। – jldupont

उत्तर

26

यदि आप पोर्ट 0 से बांधते हैं, तो जावा सिस्टम से उत्पन्न पोर्ट का उपयोग करेगा। :-) तो, यदि आपका वांछित बंदरगाह पहले से उपयोग किया गया है तो शायद यह वापस आने का सबसे आसान तरीका है।

ServerSocket s = new ServerSocket(0); 
int port = s.getLocalPort(); // returns the port the system selected 
+2

... और उदाहरण एक-दूसरे को कैसे ढूंढेंगे? क्या यह सवाल नहीं है? – jldupont

3

मैं उलटा लेता हूं और आपके ऐप के लिए एक निश्चित उच्च पोर्ट का चयन करता हूं। इसे एक कॉन्फ़िगरेशन मान बनाएं ताकि यदि आवश्यक हो तो इसे बदला जा सकता है। यह विन्यास को सरल बना देगा क्योंकि अक्सर ऐप्स के उपयोगकर्ताओं को बंदरगाहों को खोलने के लिए नेटवर्क संचालन का अनुरोध करने की आवश्यकता होती है। IANA सौंपा मूल्यों के आसपास काम:

http://www.iana.org/assignments/port-numbers

स्कैनिंग बंदरगाहों कई घुसपैठ का पता लगाने प्रणालियों के लिए एक बुरी नागरिक में अपने एप्लिकेशन बदल सकती है।

1

आप प्रत्येक उदाहरण की सेवाओं का विज्ञापन करने के लिए बोनजोर/ZeroConf का उपयोग कर सकते हैं और दूसरों को ढूंढने के लिए एक उदाहरण सक्षम कर सकते हैं। इसे निर्देशिका सेवा के रूप में सोचें जो आपके पोर्ट नेमस्पेस को प्रबंधित करने में सहायता कर सकता है।

प्रत्येक उदाहरण इस मामले में गतिशील रूप से निर्दिष्ट पोर्ट को पकड़ सकता है। बंदरगाह "0" को बाध्य करने का अनुरोध आमतौर पर सिस्टम को एक गतिशील बंदरगाह असाइन करने का निर्देश देगा।

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