2010-09-05 156 views
6

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

+0

尼斯测试。没有任何评论的倒车投票。非常有帮助... – vwegert 2016-03-10 17:54:03

回答

1

this question我发现了一个库here,它似乎尽最大努力提供跨平台功能。

+0

感谢您的提示.... 不幸的是,这是一个LGPL许可的库,这使得它很难在我的EPL项目中使用。它使用Maven,并拉动jruby和另一个奇怪的依赖(jaffl),其看似官方网站http://kenai.com/projects/jaffl/告诉我,该项目不存在.. – vwegert 2010-09-05 09:40:09

2

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

我确实认为你会认为这个函数在Java中是可用的,除此之外,我也会这么认为很少有人使用它。

+0

我看到它的方式,允许没有将服务名称解析为端口号的TCP网络就像允许文件系统访问而不关心目录.... – vwegert 2010-09-05 09:42:57

+0

@vwegert - 大多数代码是指使用硬线或配置的端口*号*的数字*不是端口名称;例如Java HTTP客户端堆栈通常在代码中内置默认的80和433端口号。你甚至可能会在C/C++代码中找到它。 – 2010-09-05 11:57:15

+0

@Stephen C:...以及1024以下的端口,这是一个有效的选项。在这种情况下(SAP消息服务器端口),端口号取决于其他某个参数(系统编号)。通常,端口设置为sapms ,其中是三字母系统ID。所以如果我有一个ID为XYZ和系统号码为42的系统,那么服务sapmsXYZ将指向端口3642 - 我希望能够看到它... – vwegert 2010-09-05 16:10:58

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 

依赖关系:

  • Build time:tomcat-coyote.jar
  • 运行时:tomcat-coyote.jar,tomcat-july.jar,tcnative-1原生lib。

下Win64的

+0

感谢您的提示,但这不是基于Tomcat的应用程序。 – vwegert 2010-09-05 16:08:08