मैं जावा का उपयोग करके किसी दिए गए मशीन में पोर्ट की उपलब्धता को प्रोग्रामेटिक रूप से कैसे निर्धारित कर सकता हूं?
यानी एक पोर्ट नंबर दिया गया है, यह निर्धारित करें कि यह पहले से ही इस्तेमाल किया जा रहा है या नहीं?
मैं जावा का उपयोग करके किसी दिए गए मशीन में पोर्ट की उपलब्धता को प्रोग्रामेटिक रूप से कैसे निर्धारित कर सकता हूं?
यानी एक पोर्ट नंबर दिया गया है, यह निर्धारित करें कि यह पहले से ही इस्तेमाल किया जा रहा है या नहीं?
जवाबों:
यह अपाचे ऊंट परियोजना से आने वाला कार्यान्वयन है :
/**
* Checks to see if a specific port is available.
*
* @param port the port to check for availability
*/
public static boolean available(int port) {
if (port < MIN_PORT_NUMBER || port > MAX_PORT_NUMBER) {
throw new IllegalArgumentException("Invalid start port: " + port);
}
ServerSocket ss = null;
DatagramSocket ds = null;
try {
ss = new ServerSocket(port);
ss.setReuseAddress(true);
ds = new DatagramSocket(port);
ds.setReuseAddress(true);
return true;
} catch (IOException e) {
} finally {
if (ds != null) {
ds.close();
}
if (ss != null) {
try {
ss.close();
} catch (IOException e) {
/* should not be thrown */
}
}
}
return false;
}
वे यूपीडीपी और टीसीपी में पोर्ट अवेलेबल हैं या नहीं इसकी जांच करने के लिए वे डेटाग्रामसॉफ्ट की जांच कर रहे हैं।
उम्मीद है की यह मदद करेगा।
ServerSocket
कुछ पोर्ट के लिए एक श्रवण बनाना है, तो उसे यही करना चाहिए, और वापस लौटना चाहिए ServerSocket
। इसे बनाना और फिर इसे बंद करना और इसे वापस करना शून्य गारंटी प्रदान करता है कि बाद में ServerSocket
उस पोर्ट का उपयोग करके बनाया जा सकता है। डिट्टो के लिए DatagramSocket
।
जावा 7 के लिए आप अधिक कॉम्पैक्ट कोड के लिए कोशिश-के-संसाधन का उपयोग कर सकते हैं:
private static boolean available(int port) {
try (Socket ignored = new Socket("localhost", port)) {
return false;
} catch (IOException ignored) {
return true;
}
}
ConnectException: 'connection refused'
, हाँ यह गलत होना चाहिए। समयबाह्य के लिए, ऐसा कुछ भी नहीं लौटाया जा सकता है, क्योंकि वास्तविक उत्तर ज्ञात नहीं है। इसलिए यह तकनीक इस उद्देश्य के लिए बेकार है।
ऐसा प्रतीत होता है कि जावा 7 के रूप में, डेविड सांतामारिया का जवाब मज़बूती से काम नहीं करता है। ऐसा लगता है कि आप अभी भी कनेक्शन का परीक्षण करने के लिए मज़बूती से सॉकेट का उपयोग कर सकते हैं।
private static boolean available(int port) {
System.out.println("--------------Testing port " + port);
Socket s = null;
try {
s = new Socket("localhost", port);
// If the code makes it this far without an exception it means
// something is using the port and has responded.
System.out.println("--------------Port " + port + " is not available");
return false;
} catch (IOException e) {
System.out.println("--------------Port " + port + " is available");
return true;
} finally {
if( s != null){
try {
s.close();
} catch (IOException e) {
throw new RuntimeException("You should handle this error." , e);
}
}
}
}
यदि आप प्रदर्शन से बहुत चिंतित नहीं हैं, तो आप हमेशा सर्वरसेट क्लास का उपयोग करके पोर्ट पर सुनने की कोशिश कर सकते हैं । यदि यह एक अपवाद फेंकता है तो इसका उपयोग किया जा रहा है।
public static boolean isAvailable(int portNr) {
boolean portFree;
try (var ignored = new ServerSocket(portNr)) {
portFree = true;
} catch (IOException e) {
portFree = false;
}
return portFree;
}
संपादित करें: यदि आप सभी करने की कोशिश कर रहे हैं, तो एक मुफ्त पोर्ट का चयन करें, फिर new ServerSocket(0)
आपके लिए एक मिल जाएगा।
निम्नलिखित समाधान स्प्रिंग-कोर (अपाचे लाइसेंस) के सॉकेट यूटिल्स से प्रेरित है ।
अन्य समाधानों की तुलना में Socket(...)
यह बहुत तेज़ है (एक सेकंड से भी कम समय में 1000 टीसीपी पोर्ट का परीक्षण):
public static boolean isTcpPortAvailable(int port) {
try (ServerSocket serverSocket = new ServerSocket()) {
// setReuseAddress(false) is required only on OSX,
// otherwise the code will not work correctly on that platform
serverSocket.setReuseAddress(false);
serverSocket.bind(new InetSocketAddress(InetAddress.getByName("localhost"), port), 1);
return true;
} catch (Exception ex) {
return false;
}
}
सॉकेट आधारित समाधान आज़माएं / पकड़ें, सटीक परिणाम नहीं मिल सकते हैं (सॉकेट पता "लोकलहोस्ट" है और कुछ मामलों में पोर्ट को लूपबैक इंटरफ़ेस द्वारा "कब्जा" किया जा सकता है और कम से कम विंडोज पर मैंने यह परीक्षण विफल देखा है अर्थात विरोध झूठा उपलब्ध के रूप में घोषित)।
SIGAR नामक एक शांत पुस्तकालय है , निम्नलिखित कोड आपको हुक कर सकते हैं:
Sigar sigar = new Sigar();
int flags = NetFlags.CONN_TCP | NetFlags.CONN_SERVER | NetFlags.CONN_CLIENT; NetConnection[] netConnectionList = sigar.getNetConnectionList(flags);
for (NetConnection netConnection : netConnectionList) {
if ( netConnection.getLocalPort() == port )
return false;
}
return true;
डेविड संतामरिया ने कहा कि उत्तर की सफाई:
/**
* Check to see if a port is available.
*
* @param port
* the port to check for availability.
*/
public static boolean isPortAvailable(int port) {
try (var ss = new ServerSocket(port); var ds = new DatagramSocket(port)) {
return true;
} catch (IOException e) {
return false;
}
}
यह अभी भी एक रेस स्थिति डेविड सेंटमारिया के जवाब देने के लिए टिप्पणी में user207421 द्वारा बताया के अधीन (कुछ बंदरगाह हड़पने सकता है के बाद इस विधि बंद कर देता है है ServerSocket
और DatagramSocket
और रिटर्न)।
मेरे मामले में यह पोर्ट से जुड़ने की कोशिश करने में मदद करता है - अगर सेवा पहले से मौजूद है, तो यह प्रतिक्रिया देगा।
try {
log.debug("{}: Checking if port open by trying to connect as a client", portNumber);
Socket sock = new Socket("localhost", portNumber);
sock.close();
log.debug("{}: Someone responding on port - seems not open", portNumber);
return false;
} catch (Exception e) {
if (e.getMessage().contains("refused")) {
return true;
}
log.error("Troubles checking if port is open", e);
throw new RuntimeException(e);
}
मेरे मामले में मुझे डाटाग्रामस्केट क्लास का उपयोग करना पड़ा।
boolean isPortOccupied(int port) {
DatagramSocket sock = null;
try {
sock = new DatagramSocket(port);
sock.close();
return false;
} catch (BindException ignored) {
return true;
} catch (SocketException ex) {
System.out.println(ex);
return true;
}
}
पहले आयात करने के लिए मत भूलना
import java.net.DatagramSocket;
import java.net.BindException;
import java.net.SocketException;
मैंने कुछ इस तरह की कोशिश की है और इसने मेरे साथ बहुत अच्छा काम किया है
Socket Skt;
String host = "localhost";
int i = 8983; // port no.
try {
System.out.println("Looking for "+ i);
Skt = new Socket(host, i);
System.out.println("There is a Server on port "
+ i + " of " + host);
}
catch (UnknownHostException e) {
System.out.println("Exception occured"+ e);
}
catch (IOException e) {
System.out.println("port is not used");
}