2010-09-05 17 views
6

Necesito algo así como la función C getservbyname() para una aplicación Java. Tengo que analizar un archivo de configuración que puede contener un número de puerto o el nombre del servicio, y en este último caso, necesito convertirlo a un número de puerto para pasarlo a una biblioteca. Encontré this bug y me sorprendió un poco que la pregunta se hiciera en 1997 (!) Y que ni siquiera se considere su implementación durante 13 años. Realmente no quiero hacer el análisis sintáctico específico de la plataforma para mí, ¿hay alguna otra manera?¿Obtener el número de puerto para el nombre del servicio?

+0

Niza. Un voto de bajada sin ningún comentario. Muy útil ... – vwegert

Respuesta

1

En this question encontré una biblioteca here que parece hacer todo lo posible para proporcionar la funcionalidad de plataforma cruzada.

+0

Gracias por la pista .... Lamentablemente, se trata de una biblioteca con licencia LGPL que hace que sea bastante difícil de usar en mi proyecto EPL. Y utiliza Maven y atrae jruby y otra dependencia extraña (jaffl) cuyo sitio web aparentemente oficial http://kenai.com/projects/jaffl/ me dice que el proyecto no existe. – vwegert

2

La mayoría de las funciones nuevas añadidas a Java han tenido un caso de uso probado como una biblioteca de código abierto de Java desde hace algún tiempo. p.ej. la biblioteca de concurrencia solo se agregó después de que fuera una biblioteca independiente durante 6 años. Los cierres solo se agregan porque la mayoría de otros lenguajes dinámicos lo tienen ahora. (Y muy a regañadientes)

Estoy de acuerdo en que usted pensaría que esta función está disponible en Java, excepto, yo también lo haría, así que creo que muy poca gente lo usa.

+0

La forma en que lo veo, lo que permite La conexión en red TCP sin la resolución de nombres de servicio a números de puerto es como permitir el acceso al sistema de archivos sin preocuparse por los directorios ... – vwegert

+0

@vwegert - la mayoría de los códigos se refiere a servicios que usan cables físicos o puertos configurados * números * no nombres de puertos; p.ej. una pila de cliente Java http normalmente tiene los números de puerto predeterminados 80 y 433 integrados en el código. Probablemente incluso encuentre esto en el código C/C++. –

+0

@Stephen C: ... y para los puertos por debajo de 1024 esa es una opción válida para tomar. En este caso (puerto del servidor de mensajes SAP), el número de puerto depende de algún otro parámetro (el número del sistema). Normalmente, el puerto se establece como sapms , donde es la ID del sistema de tres letras. Entonces, si tengo un sistema con el ID XYZ y el sistema número 42, el servicio sapmsXYZ apuntará al puerto 3642, y me gustaría poder buscarlo ... – vwegert

3

Apache Tomcat proporcionan algunos JNI de unión para que:

package so3645405; 

import org.apache.tomcat.jni.Address; 
import org.apache.tomcat.jni.Library; 
import org.apache.tomcat.jni.Sockaddr; 
import org.apache.tomcat.jni.Socket; 

public final class Net { 
    private Net() { 

    } 

    public static int getServByName(final String serviceName) { 
     try { 
      Library.initialize("tcnative-1"); 
      long sa = Address.info(Address.APR_ANYADDR, Socket.APR_INET, 0, 0, 
        Library.globalPool()); 
      Sockaddr addr = new Sockaddr(); 
      Address.getservbyname(sa, serviceName); 
      Address.fill(addr, sa); 
      return addr.port; 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return 0; 
    } 

    public static void main(final String[] args) { 
     if (args.length > 0) { 
      System.out.println(Net.getServByName(args[0])); 
     } else { 
      System.out.println("Usage: prog <serviceName>"); 
     } 
    } 
} 

de uso:

java -Djava.library.path=./ -classpath tomcat-coyote.jar;tomcat-juli.jar;. 
     so3645405.Net https 

de salida:

443 

Dependencias:

  • Tiempo de compilación: tomcat-coyote.jar
  • Tiempo de ejecución: tomcat-coyote.jar, tomcat-july.jar, tcnative-1 native lib.

probado bajo Win64

+0

Gracias por la sugerencia, pero esta no es una aplicación basada en Tomcat. – vwegert

Cuestiones relacionadas