2011-03-08 16 views
6

Tengo la necesidad de descubrir puertos abiertos en un servidor remoto. Me pregunto si esto es posible. Estaba pensando en abrir un socket, y si esto tiene éxito, significa que se usa ... de lo contrario, si recibo una excepción, no se usa.Pruebe si el puerto remoto está en uso

Por ejemplo,

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

es éste un enfoque viable?

+0

posible duplicado de [sockets: Descubre la disponibilidad del puerto utilizando Java] (http://stackoverflow.com/questions/434718/sockets-discover-port-availability-using-java) – HCarrasko

+3

@Hector Las respuestas en que se la pregunta se trata principalmente de probar si algo está vinculado a un puerto localmente. Esta pregunta es sobre un sistema remoto. – Kenster

+0

Creo que la respuesta de @Alain Pannetier debería ser la aceptada. – Alfergon

Respuesta

3

¿Esto tiene que hacerse en Java? Hay herramientas para eso (Nmap). De lo contrario, su método "funcionará", pero no estoy seguro de lo útil que será.

Tenga cuidado, los firewalls pueden hacer algunas cosas complicadas. Por ejemplo, permitir que las conexiones se establezcan pero no hacer nada con él, por lo que parece que el puerto está abierto, pero el firewall realmente está bloqueando todo el tráfico. O bien, algunos puertos solo estarán abiertos a las solicitudes de un determinado rango de IP, subred o dispositivo físico.

+0

gracias. es nuestro servidor, y controlamos el firewall. tenemos una aplicación que establece el reverso del puerto hacia el servidor. tenemos un servicio que rastrea el puerto en uso, pero aún necesitamos lo anterior como un sistema de seguridad en caso de que el servicio no se sincronice con los puertos reales. –

10

FWIW, una solución de Java que utilizo de vez en cuando (mejor que telnet: admite el tiempo de espera).

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); 
    } 
} 
Cuestiones relacionadas