使用TimeTCPClient从公共时间服务器获取时间

我尝试使用以下代码从公共时间服务器获取时间。

package aaa; import java.util.Arrays; import java.util.List; import org.apache.commons.net.TimeTCPClient; public final class Main { public static java.util.Date getNTPDate() { List hosts = Arrays.asList("0.pool.ntp.org"); for (String host : hosts) { TimeTCPClient client = new TimeTCPClient(); // We want to timeout if a response takes longer than 5 seconds client.setDefaultTimeout(5000); try { client.connect(host); java.util.Date ntpDate = client.getDate(); client.disconnect(); // Just to be extra caution. if (ntpDate != null) { return ntpDate; } } catch (java.net.SocketException exp) { exp.printStackTrace(); } catch (java.io.IOException exp) { exp.printStackTrace(); } } return null; } public static final void main(String[] args) { System.out.println(getNTPDate()); } } 

但是,所有的时间,我得到java.net.ConnectException: Connection timed out: connect

我试过谷歌几个不同的时间服务器。 但是,他们没有工作。 我想知道,问题出在我的代码或我选择的服务器上?

NTP是与时间协议不同的协议。 NTP服务器仅通过端口UDP / 123进行通信。 时间服务器使用TCP / 37(TimeTCPClient似乎正确实现)。 如果要获得远程时间,请使用适当的服务器(ntp.xs4all.nl似乎正在侦听时间端口)。

您可以使用正确的方法:

 import java.io.IOException; import java.net.InetAddress; import java.util.Date; import org.apache.commons.net.ntp.NTPUDPClient; import org.apache.commons.net.ntp.TimeInfo; public final class PublicServerTime { public static Date getNTPDate() { String[] hosts = new String[]{ "ntp02.oal.ul.pt", "ntp04.oal.ul.pt", "ntp.xs4all.nl"}; NTPUDPClient client = new NTPUDPClient(); // We want to timeout if a response takes longer than 5 seconds client.setDefaultTimeout(5000); for (String host : hosts) { try { InetAddress hostAddr = InetAddress.getByName(host); System.out.println("> " + hostAddr.getHostName() + "/" + hostAddr.getHostAddress()); TimeInfo info = client.getTime(hostAddr); Date date = new Date(info.getReturnTime()); return date; } catch (IOException e) { e.printStackTrace(); } } client.close(); return null; } public static final void main(String[] args) { System.out.println(getNTPDate()); } 

好吧,我可以从我的机器在0.pool.ntp.org上ping服务器,对吗? 由于超时exception主要是由于运行此代码的机器无法在60秒内连接到主机。