使用Java从http代理后面的ntp服务器检索时间

时间:2013-08-11 22:26:26

标签: java proxy ntp

我正在使用Apache Commons Net TimeTCPClient从时间服务器检索当前时间。我正在尝试在使用(经过身份验证的)http代理服务器的公司网络上进行此项工作。我正在使用Proxy Vole库检测代理。 不幸的是,似乎Java doesn't support http proxies直到Java 8?我总是得到java.net.SocketException: Unknown proxy type: HTTP例外。

如何在http代理后面从ntp服务器检索当前时间?

编辑:问题似乎是Proxy Vole库使用ProxySelector类,它总是导致SocketException。如果我使用ntp或http并不重要,只要设置了Vole的ProxySelector,就会出现这个问题。

2 个答案:

答案 0 :(得分:0)

公司代理几乎肯定只是代理HTTP流量(端口80和443)。

NTP使用端口123,可能被公司防火墙阻止。这就是你获得SocketException的原因。

答案 1 :(得分:0)

如果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(代理)调用中包含java.net.Proxy参数或在JVM系统属性中设置代理;例如System.setProperty(“http.proxyHost”,“myproxy.org”)等。