我正在使用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,就会出现这个问题。
答案 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”)等。