java - मतलब - मुंबई बंदरगाह




एक उपलब्ध बंदरगाह कैसे ढूंढें? (9)

ग्रहण एसडीके में एक वर्ग SocketUtil , जो आप चाहते हैं। आप गिट स्रोत कोड में एक नज़र डाल सकते हैं।

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

  1. पोर्ट नंबरों की किस श्रेणी में मुझे खोजना चाहिए? (मैंने बंदरगाह 12345, 12346, और 12347 का उपयोग किया और यह ठीक था)।

  2. मैं कैसे पता लगा सकता हूं कि किसी दिए गए बंदरगाह पर किसी अन्य सॉफ्टवेयर द्वारा कब्जा नहीं किया गया है?


जावा 1.7 से शुरू करना आप इस तरह के संसाधनों का उपयोग कर सकते हैं:

  private Integer findRandomOpenPortOnAllLocalInterfaces() throws IOException {
    try (
        ServerSocket socket = new ServerSocket(0);
    ) {
      return socket.getLocalPort();

    }
  }

यदि आपको किसी विशिष्ट इंटरफ़ेस पर एक खुला पोर्ट ढूंढने की आवश्यकता है तो वैकल्पिक ServerSocket लिए ServerSocket दस्तावेज़ देखें।

चेतावनी: इस विधि द्वारा लौटाए गए पोर्ट नंबर का उपयोग करने वाला कोई भी कोड रेस कंडीशन के अधीन है - सर्वरस्केट इंस्टेंस को बंद करने के तुरंत बाद एक अलग प्रक्रिया / थ्रेड उसी पोर्ट से जुड़ सकता है।


यदि आप सर्वर सर्वर का उपयोग करके अपना स्वयं का सर्वर बनाना चाहते हैं, तो आप इसे अपने लिए एक मुफ्त पोर्ट चुन सकते हैं:

  ServerSocket serverSocket = new ServerSocket(0);
  int port = serverSocket.getLocalPort();

अन्य सर्वर कार्यान्वयन आमतौर पर समान समर्थन होता है। जेटी उदाहरण के लिए एक मुफ्त बंदरगाह चुनता है जब तक कि आप इसे स्पष्ट रूप से सेट नहीं करते:

  Server server = new Server();
  ServerConnector connector = new ServerConnector(server);
  // don't call: connector.setPort(port);
  server.addConnector(connector);
  server.start();
  int port = connector.getLocalPort();

यदि आप सर्वर सॉकेट के निर्माता को पोर्ट नंबर के रूप में 0 पास करते हैं, तो यह आपके लिए एक पोर्ट आवंटित करेगा।


यदि आपका सर्वर शुरू होता है, तो उस सॉकेट का उपयोग नहीं किया गया था।

संपादित करें

कुछ इस तरह:

ServerSocket s = null ;

try { 
    s = new ServerSocket( 0 ); 
} catch( IOException ioe ){
   for( int i = START; i < END ; i++ ) try {
        s = new ServerSocket( i );
    } catch( IOException ioe ){}
}
// At this point if s is null we are helpless
if( s == null ) {
    throw new IOException(
       Strings.format("Unable to open server in port range(%d-%d)",START,END));
}

यदि आपको श्रेणी के उपयोग की आवश्यकता है:

public int nextFreePort(int from, int to) {
    int port = randPort(from, to);
    while (true) {
        if (isLocalPortFree(port)) {
            return port;
        } else {
            port = ThreadLocalRandom.current().nextInt(from, to);
        }
    }
}

private boolean isLocalPortFree(int port) {
    try {
        new ServerSocket(port).close();
        return true;
    } catch (IOException e) {
        return false;
    }
}

यह आपकी मदद नहीं कर सकता है, लेकिन मेरी (उबंटू) मशीन पर मेरे पास एक फ़ाइल / आदि / सेवाएं हैं जिनमें कम से कम बंदरगाहों का उपयोग कुछ ऐप्स द्वारा किया जाता है / आरक्षित किया जाता है। ये उन ऐप्स के लिए मानक बंदरगाह हैं।

कोई गारंटी नहीं है कि ये चल रहे हैं, केवल इन ऐप्स का उपयोग करने वाले डिफ़ॉल्ट पोर्ट (इसलिए यदि संभव हो तो आपको उनका उपयोग नहीं करना चाहिए)।

500 से अधिक बंदरगाहों को परिभाषित किया गया है, लगभग आधा यूडीपी और आधा टीसीपी।

आईएएनए द्वारा सूचनाओं का उपयोग करके फाइलें बनाई जाती हैं, आईएएनए असाइन किए गए पोर्ट नंबर देखें


यह जावा 6 पर मेरे लिए काम करता है

    ServerSocket serverSocket = new ServerSocket(0);
    System.out.println("listening on port " + serverSocket.getLocalPort());







port