2011-03-08 10 views
6

मुझे दूरस्थ सर्वर पर खुले बंदरगाहों को खोजने की आवश्यकता है। मैं सोच रहा हूं कि यह संभव है या नहीं। मैं सोच रहा था कि मैं एक सॉकेट खोलूंगा, और यदि यह सफल होता है, तो इसका मतलब है कि इसका उपयोग किया जाता है ... अन्यथा, अगर मुझे अपवाद मिलता है, तो इसका उपयोग नहीं किया जाता है।परीक्षण अगर रिमोट पोर्ट उपयोग में है

उदाहरण के लिए,

public boolean isActive() { 
    Socket s = null; 
    try { 
     s = new Socket(); 
     s.setReuseAddress(true); 
     SocketAddress sa = new InetSocketAddress(this.host, this.port); 
     s.connect(sa, 3000); 
     return true; 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     if (s != null) { 
      try { 
       s.close(); 
      } catch (IOException e) { 
      } 
     } 
    } 
    return false; 
} 

इस एक व्यवहार्य तरीका है?

+0

संभव डुप्लिकेट [सॉकेट: बंदरगाह उपलब्धता डिस्कवर जावा का उपयोग कर] (http://stackoverflow.com/questions/434718/sockets-discover-port-availability-using-java) – HCarrasko

+3

@Hector उस पर जवाब प्रश्न ज्यादातर परीक्षण के बारे में हैं कि कुछ स्थानीय रूप से बंदरगाह से बंधे हैं या नहीं। यह सवाल रिमोट सिस्टम के बारे में है। – Kenster

+0

मुझे लगता है कि @Alain Pannetier उत्तर स्वीकार्य होना चाहिए। – Alfergon

उत्तर

3

क्या यह जावा में किया जाना है? इसके लिए उपकरण हैं (Nmap)। अन्यथा, आपकी विधि "काम करेगी" लेकिन मुझे यकीन नहीं है कि यह कितना उपयोगी होगा।

चेतावनी दी जानी चाहिए, फ़ायरवॉल कुछ मुश्किल चीजें कर सकते हैं। जैसे कनेक्शन स्थापित करने की अनुमति देते हैं लेकिन इसके साथ कुछ भी नहीं करते हैं, ऐसा लगता है जैसे पोर्ट खुला है लेकिन फ़ायरवॉल वास्तव में सभी ट्रैफिक को अवरुद्ध कर रहा है। या, कुछ बंदरगाह केवल एक निश्चित आईपी रेंज, सबनेट, या भौतिक डिवाइस से अनुरोध के लिए खुले होंगे।

+0

धन्यवाद। यह हमारा सर्वर है, और हम फ़ायरवॉल को नियंत्रित करते हैं। हमारे पास एक ऐसा एप्लिकेशन है जो सर्वर पर रिवर्स पोर्ट को आगे बढ़ाता है। हमारे पास एक ऐसी सेवा है जो उपयोग में बंदरगाह को ट्रैक करती है, लेकिन अगर सेवा वास्तविक बंदरगाहों के साथ सिंक हो जाती है तो हमें अभी भी एक असफलता के रूप में उपरोक्त की आवश्यकता होती है। –

10

एफडब्ल्यूआईडब्ल्यू, एक जावा समाधान जो मैं समय-समय पर उपयोग करता हूं (टेलनेट से बेहतर: टाइमआउट का समर्थन करता है)।

package com.acme.util; 

import java.io.IOException; 
import java.net.InetSocketAddress; 
import java.net.Socket; 
import java.net.SocketAddress; 
import java.net.SocketTimeoutException; 
import java.net.UnknownHostException; 

public class CheckSocket { 

    public static void main(String[] args) { 
     int exitStatus = 1 ; 
     if (args.length != 3) { 
      System.out.println("Usage: CheckSocket node port timeout"); 
     } else { 
      String node = args[0]; 
      int port = Integer.parseInt(args[1]); 
      int timeout = Integer.parseInt(args[2]); 

      Socket s = null; 
      String reason = null ; 
      try { 
       s = new Socket(); 
       s.setReuseAddress(true); 
       SocketAddress sa = new InetSocketAddress(node, port); 
       s.connect(sa, timeout * 1000); 
      } catch (IOException e) { 
       if (e.getMessage().equals("Connection refused")) { 
        reason = "port " + port + " on " + node + " is closed."; 
       }; 
       if (e instanceof UnknownHostException) { 
        reason = "node " + node + " is unresolved."; 
       } 
       if (e instanceof SocketTimeoutException) { 
        reason = "timeout while attempting to reach node " + node + " on port " + port; 
       } 
      } finally { 
       if (s != null) { 
        if (s.isConnected()) { 
         System.out.println("Port " + port + " on " + node + " is reachable!"); 
         exitStatus = 0; 
        } else { 
         System.out.println("Port " + port + " on " + node + " is not reachable; reason: " + reason); 
        } 
        try { 
         s.close(); 
        } catch (IOException e) { 
        } 
       } 
      } 
     } 
     System.exit(exitStatus); 
    } 
} 
की
संबंधित मुद्दे