簡體   English   中英

使用Java從HTTP代理后面的ntp服務器檢索時間

[英]retrieving time from an ntp server behind an http proxy using Java

我正在使用Apache Commons Net TimeTCPClient從時間服務器檢索當前時間。 我正在嘗試在使用(經過身份驗證的)http代理服務器的公司網絡上進行此工作。 我正在使用Proxy Vole庫檢測代理。 不幸的是,直到Java 8, Java似乎才不支持HTTP代理 我總是得到java.net.SocketException: Unknown proxy type: HTTP異常。

在http代理后面時,如何從ntp服務器檢索當前時間?

編輯:問題似乎是代理Vole庫使用ProxySelector類,該類始終會導致SocketException。 我使用ntp還是http都沒關系,只要設置了Vole的ProxySelector,就會出現此問題。

企業代理幾乎可以肯定只是代理HTTP通信(端口80和443)。

NTP使用端口123,該端口可能已被公司防火牆阻止。 這就是為什么要獲取SocketException的原因。

如果UDP上的123端口被阻止,則您將無法檢索NTP數據報包。 但是,您仍然有兩個選擇。

一種解決方案是在公司防火牆中使用NTP服務器(如果可用)。 您需要聯系系統管理員或IT部門。

您還可以建立到公共網站的HTTP連接。 例如http://www.ntp.org/ ,並通過提取日期HTTP標頭的值來獲取遠程時鍾時間。

HTTP標頭如下所示:

HTTP/1.1 200 OK
Date: Fri, 07 Mar 2014 02:36:30 GMT
Content-Type: text/html
Connection: close
Server: Apache

Date HTTP標頭將遠程服務器的時鍾時間設置為第二個分辨率,您可以將其轉換為一個長值,以毫秒為單位,該毫秒數是標准時期(1970年1月1日)以來的毫秒數。

這是獲取URL並將日期標頭轉換為Java Date實例的代碼段:

URL url = new URL("http://www.ntp.org/");
URLConnection conn = url.openConnection();
if (conn instanceof HttpURLConnection) {
    HttpURLConnection httpConn = (HttpURLConnection)conn;
    httpConn.setRequestMethod("HEAD");
}
long dateTime = conn.getHeaderFieldDate("Date", 0);
if (dateTime > 0) {
    Date receiveTime = new Date(dateTime);
    // do something with remote timestamp
}

如果在防火牆后面,則必須在url.openConnection(proxy)調用中包含java.net.Proxy參數,或者在JVM系統屬性中設置代理。 例如System.setProperty(“ http.proxyHost”,“ myproxy.org”)等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM