1

Apache Commons Net TimeTCPClientを使用して、タイム サーバーから現在の時刻を取得しています。(認証された) http プロキシ サーバーを使用している企業ネットワークでこの作業を実行しようとしています。Proxy Voleライブラリでプロキシを検出しています。残念ながら、 Java は Java 8 までhttp プロキシをサポートしていないようです?? 私はいつもjava.net.SocketException: Unknown proxy type: HTTP例外を受け取ります。

http プロキシの背後にある場合、ntp サーバーから現在の時刻を取得するにはどうすればよいですか?

編集:問題は、Proxy Vole ライブラリがProxySelectorクラスを使用していることにあるようです。これにより、常に SocketException が発生します。ProxySelector by Vole が設定されている限り、ntp と http のどちらを使用しても、この問題は発生します。

4

2 に答える 2

0

企業プロキシは、ほぼ確実に HTTP トラフィック (ポート 80 & 443) をプロキシしているだけです。

NTP はポート 123 を使用しますが、これはおそらく会社のファイアウォールによってブロックされています。これが、SocketException を取得している理由です。

于 2013-08-11T23:08:32.127 に答える
0

UDP 経由のポート 123 がブロックされている場合、NTP データグラム パケットを取得できません。ただし、まだいくつかのオプションがあります。

解決策の 1 つは、使用可能な場合は、企業のファイアウォール内で NTP サーバーを使用することです。システム管理者または IT 部門に連絡する必要があります。

公開 Web サイトへの HTTP 接続を作成することもできます。例: http://www.ntp.org/、date 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 日) からのミリ秒単位の long 値に変換できる、そのリモート サーバーの時刻を 2 番目の解像度で提供します。

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") など

于 2014-03-07T02:41:56.007 に答える