對於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. 在Ember Controller中獲取服務器名稱和端口號
- 2. 獲取HTTPS的JSP頁面的服務器名稱和端口號
- 3. 獲取Oracle 10g主機的服務名稱,端口號和IP地址
- 4. 如何獲取服務器名稱,端口和上下文
- 5. 端口到Java中的服務名稱?
- 6. 如何從Liferay velocity模板獲取服務器名稱和服務器端口?
- 7. Nginx上的服務器名稱和端口號是否相同?
- 8. 獲取服務器名稱
- 9. 將服務名稱轉換爲端口
- 10. SMTP服務器名稱和端口
- 11. Java WebService中的端口名稱和服務名稱未更改
- 12. 如何獲取端口名稱列表?
- 13. 根據服務器名稱獲取服務名稱
- 14. 通過瀏覽器獲取服務器的端口號
- 15. 獲取NodeJS服務器正在偵聽的端口號
- 16. 獲取服務器正在監聽的端口號?
- 17. HTTP服務器端口號
- 18. 服務器端口號
- 19. GIT - 獲取推送的分行名稱,服務器端
- 20. 獲取WCF服務的名稱空間
- 21. 獲取服務器名稱的ContextLoaderListener
- 22. NodeJS:如何獲取服務器端口?
- 23. 從Application_Start獲取服務器端口
- 24. 獲取tcp端口網站服務於
- 25. 在centos中獲取ldap服務器IP地址和端口號
- 26. 獲取ASP.NET開發服務器端口號
- 27. 當使用帶有臨時端口的JMX服務器時,如何獲取服務器端口號?
- 28. Ruby獲取UDPSocket端口號
- 29. 如何從JavaScript獲取終端服務客戶機名稱?
- 30. 獲取客戶端應用程序名稱到Web服務
尼斯測試。沒有任何評論的倒車投票。非常有幫助... – vwegert 2016-03-10 17:54:03