2011-03-08 12 views
6

Uzak sunucuda açık bağlantı noktalarını keşfetmem gerekiyor. Bunun mümkün olup olmadığını merak ediyorum. Bir soket açacağımı düşünüyordum ve eğer bu başarılı olursa, bunun kullanıldığı anlamına gelir ... aksi halde bir istisna alırsam, o zaman kullanılmaz. Örneğin Uzak bağlantı noktası kullanımda olup olmadığını test edin

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

yaşayabilen bir yaklaşımdır?

+0

olası yinelenen [Yuvaları: Java kullanarak liman kullanılabilirliğini keşfedin] (http://stackoverflow.com/questions/434718/sockets-discover-port-availability-using-java) – HCarrasko

+3

@Hector bu konuda cevaplar Soru çoğunlukla bir şeyin yerel olarak bir limana bağlı olup olmadığını sınamakla ilgilidir. Bu soru uzak bir sistem hakkında. – Kenster

+0

Sanırım @Alain Pannetier cevap kabul edildi. – Alfergon

cevap

3

Bunun Java'da yapılması gerekiyor mu? Bunun için araçlar var (Nmap). Else, yönteminiz "işe yarayacak" ancak bunun ne kadar yararlı olacağından emin değilim.

Dikkatli olun, güvenlik duvarları bazı zor şeyler yapabilir. Bağlantıların kurulmasına izin vermek, ancak onunla hiçbir şey yapmamak gibi, böylece bağlantı noktası açıkmış gibi görünür, ancak güvenlik duvarı aslında tüm trafiği engeller. Veya bazı bağlantı noktaları yalnızca belirli bir IP aralığından, alt ağdan veya fiziksel cihazdan gelen isteklere açık olacaktır.

+0

teşekkürler. Bu bizim sunucumuz ve güvenlik duvarını kontrol ediyoruz. sunucuya ileri geri bağlantı noktası oluşturan bir uygulama var. kullanımda portu izleyen bir servisimiz var, ancak servisin gerçek portlarla senkronize olması durumunda yukarıdaki gibi bir arızaya ihtiyaç duyuyoruz. –

10

FWIW, zaman zaman kullanıyorum bir Java çözümü (telnet daha iyi: zaman aşımı destekler).

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); 
    } 
} 
ait
İlgili konular