代码之家  ›  专栏  ›  技术社区  ›  vwegert

获取服务名称的端口号?

  •  6
  • vwegert  · 技术社区  · 15 年前

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

    3 回复  |  直到 15 年前
        1
  •  1
  •   Community Mohan Dere    9 年前

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

        2
  •  3
  •   user180100    15 年前

    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下测试

        3
  •  2
  •   Peter Lawrey    15 年前

    添加到Java中的大多数新特性在一段时间内已经作为一个开源Java库使用了一个行之有效的用例。例如,并发库只有在成为独立库6年后才被添加。之所以添加闭包,是因为大多数其他动态语言现在都有闭包。(非常不情愿地)

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