2010-09-05 211 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