对于Java应用程序,我需要类似C函数getservbyname()的东西。我必须解析可能包含端口号或服务名称的配置文件,在后一种情况下,我需要将其转换为端口号以传递到库。我发现this bug,并且有些惊讶于这个问题在1997年被问到(!),甚至没有考虑过13年的实施。我真的不想为自己做平台特定的解析东西 - 有没有其他方法?获取服务名称的端口号?
回答
在this question我发现了一个库here,它似乎尽最大努力提供跨平台功能。
感谢您的提示.... 不幸的是,这是一个LGPL许可的库,这使得它很难在我的EPL项目中使用。它使用Maven,并拉动jruby和另一个奇怪的依赖(jaffl),其看似官方网站http://kenai.com/projects/jaffl/告诉我,该项目不存在.. – vwegert 2010-09-05 09:40:09
添加到Java中的大多数新功能在一段时间内都作为开源Java库已经被证明有用例。例如并发库只有在它是一个独立的库6年后才被添加。由于大多数其他动态语言现在都有,因此只能添加闭包。 (而且很不情愿)
我确实认为你会认为这个函数在Java中是可用的,除此之外,我也会这么认为很少有人使用它。
我看到它的方式,允许没有将服务名称解析为端口号的TCP网络就像允许文件系统访问而不关心目录.... – vwegert 2010-09-05 09:42:57
@vwegert - 大多数代码是指使用硬线或配置的端口*号*的数字*不是端口名称;例如Java HTTP客户端堆栈通常在代码中内置默认的80和433端口号。你甚至可能会在C/C++代码中找到它。 – 2010-09-05 11:57:15
@Stephen C:...以及1024以下的端口,这是一个有效的选项。在这种情况下(SAP消息服务器端口),端口号取决于其他某个参数(系统编号)。通常,端口设置为sapms
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
依赖关系:
- Build time:tomcat-coyote.jar
- 运行时:tomcat-coyote.jar,tomcat-july.jar,tcnative-1原生lib。
下Win64的
感谢您的提示,但这不是基于Tomcat的应用程序。 – vwegert 2010-09-05 16:08:08
- 1. 如何获取服务器名称,端口和上下文
- 2. 端口到Java中的服务名称?
- 3. Nginx上的服务器名称和端口号是否相同?
- 4. 获取服务器名称
- 5. 将服务名称转换为端口
- 6. Java WebService中的端口名称和服务名称未更改
- 7. 根据服务器名称获取服务名称
- 8. 获取NodeJS服务器正在侦听的端口号
- 9. 服务器端口号
- 10. HTTP服务器端口号
- 11. 获取WCF服务的名称空间
- 12. 获取服务器名称的ContextLoaderListener
- 13. 获取ASP.NET开发服务器端口号
- 14. 在centos中获取ldap服务器IP地址和端口号
- 15. NodeJS:如何获取服务器端口?
- 16. 获取tcp端口网站服务于
- 17. 从Application_Start获取服务器端口
- 18. 当使用带有临时端口的JMX服务器时,如何获取服务器端口号?
- 19. Ruby获取UDPSocket端口号
- 20. 如何从JavaScript获取终端服务客户机名称?
- 21. 无法获取SQL服务器名称
- 22. 如何从服务实现中读取服务端点名称
- 23. python-scapy:如何将端口号转换为服务名称?在Scapy的
- 24. 如何将服务器名称与字符串中的端口号分开?
- 25. 通过服务的名称获取Windows服务的PID
- 26. Flash:获取符号名称
- 27. 端口号为80的Apache服务器
- 28. 服务器和客户端显示的公共端口号不同端口号
- 29. 终端服务:以管理员身份运行时获取客户端名称
- 30. 如何获取C#中的开放端口的进程名称?
尼斯测试。没有任何评论的倒车投票。非常有帮助... – vwegert 2016-03-10 17:54:03