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。我用ntp还是http没关系,只要设置了vole的proxyselector,就会出现这个问题。

4

2 回答 2

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

于 2014-03-07T02:41:56.007 回答
0

企业代理几乎可以肯定只是代理 HTTP 流量(端口 80 和 443)。

NTP 使用端口 123,该端口可能已被公司防火墙阻止。这就是您收到 SocketException 的原因。

于 2013-08-11T23:08:32.127 回答