对于Java应用程序,我需要类似C函数getservbyname()的东西。我必须解析可能包含端口号或服务名称的配置文件,在后一种情况下,我需要将其转换为端口号以传递给库。我发现this bug并且有点惊讶于1997年提出了这个问题(!),甚至没有考虑实施13年。我真的不想为自己做特定于平台的解析 - 有没有其他办法?
答案 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
依赖关系:
在win64下测试
答案 1 :(得分:2)
Java中添加的大多数新功能已经在一段时间内作为开源Java库得到了验证。例如并发库只是在独立库6年之后才被添加。只是添加了闭包,因为大多数其他动态语言现在都有。 (而且非常不情愿)
我同意你会认为这个函数在Java中可用,除了,我也会这么认为很少有人使用它。
答案 2 :(得分:1)
在this question中,我找到了一个图书馆here,它似乎尽力提供跨平台的功能。