如果 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") 等。