java मतलब एक उपलब्ध बंदरगाह कैसे ढूंढें?




मुंबई बंदरगाह (11)

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

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

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

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


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

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

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

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


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



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

  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();

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

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;
    }
}

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

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

    }
  }

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

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



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

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

Wikipedia अनुसार, आपको पोर्ट्स 49152 से 65535 उपयोग करना चाहिए यदि आपको 'जाने-माने' पोर्ट की आवश्यकता नहीं है।

AFAIK एक बंदरगाह निर्धारित करने का एकमात्र तरीका है जिसका उपयोग बंदरगाह को खोलने का प्रयास करना है।


यदि आपको पोर्ट का उपयोग करने पर कोई फर्क नहीं पड़ता है, तो सर्वरस्केट कन्स्ट्रक्टर को 0 का पोर्ट निर्दिष्ट करें और यह किसी भी निःशुल्क पोर्ट पर सुन जाएगा।

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

यदि आप बंदरगाहों के एक विशिष्ट सेट का उपयोग करना चाहते हैं, तो सबसे आसान तरीका संभव है कि जब तक कोई काम न करे तब तक उनके माध्यम से पुन: प्रयास करें। कुछ इस तरह:

public ServerSocket create(int[] ports) throws IOException {
    for (int port : ports) {
        try {
            return new ServerSocket(port);
        } catch (IOException ex) {
            continue; // try next port
        }
    }

    // if the program gets here, no port in the range was found
    throw new IOException("no free port found");
}

इस तरह इस्तेमाल किया जा सकता है:

try {
    ServerSocket s = create(new int[] { 3843, 4584, 4843 });
    System.out.println("listening on port: " + s.getLocalPort());
} catch (IOException ex) {
    System.err.println("no available ports");
}




port