获取服务名称的端口号?

时间:2010-09-05 08:01:54

标签: java

对于Java应用程序,我需要类似C函数getservbyname()的东西。我必须解析可能包含端口号或服务名称的配置文件,在后一种情况下,我需要将其转换为端口号以传递给库。我发现this bug并且有点惊讶于1997年提出了这个问题(!),甚至没有考虑实施13年。我真的不想为自己做特定于平台的解析 - 有没有其他办法?

3 个答案:

答案 0 :(得分:3)

Apache Tomcat为此提供了一些JNI绑定:

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

用法:

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

输出:

443

依赖关系:

  • 构建时间:tomcat-coyote.jar
  • 运行时:tomcat-coyote.jar,tomcat-july.jar,tcnative-1 native lib。

在win64下测试

答案 1 :(得分:2)

Java中添加的大多数新功能已经在一段时间内作为开源Java库得到了验证。例如并发库只是在独立库6年之后才被添加。只是添加了闭包,因为大多数其他动态语言现在都有。 (而且非常不情愿)

我同意你会认为这个函数在Java中可用,除了,我也会这么认为很少有人使用它。

答案 2 :(得分:1)

this question中,我找到了一个图书馆here,它似乎尽力提供跨平台的功能。