【发布时间】:2019-03-28 20:38:58
【问题描述】:
我需要来自 NTP 服务器的时间。
我系了这个:
TimeUDPClient client = new TimeUDPClient();
try {
client.open();
client.setSoTimeout(10000);
client.getTime(InetAddress.getByName(host));
client.close();
} catch (IOException exp) {
System.out.println("NTP connection error");
exp.printStackTrace();
return;
}
10 秒后,我得到了这个异常:
java.net.SocketTimeoutException: 接收超时 在 java.net.PlainDatagramSocketImpl.receive0(本机方法) 在 java.net.AbstractPlainDatagramSocketImpl.receive(AbstractPlainDatagramSocketImpl.java:143) 在 java.net.DatagramSocket.receive(DatagramSocket.java:812) 在 org.apache.commons.net.time.TimeUDPClient.getTime(TimeUDPClient.java:84) 在 org.apache.commons.net.time.TimeUDPClient.getTime(TimeUDPClient.java:98) 在 de.modusoft.opt.viewer.TimeSyncThread.run(TimeSyncThread.java:34) 在 java.lang.Thread.run(Thread.java:748)
我也试过这个:
TimeTCPClient client = new TimeTCPClient();
client.setConnectTimeout(10000);
try {
client.connect(host);
Date ntpDate = client.getDate();
client.disconnect();
System.out.println("ntpDate = " + ntpDate);
} catch (IOException exp) {
System.out.println("NTP connection error");
exp.printStackTrace();
return;
}
还有一个超时异常。
java.net.SocketTimeoutException: 连接超时 在 java.net.PlainSocketImpl.socketConnect(本机方法) 在 java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) 在 java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 在 java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 在 java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 在 java.net.Socket.connect(Socket.java:589) 在 org.apache.commons.net.SocketClient.connect(SocketClient.java:182) 在 org.apache.commons.net.SocketClient.connect(SocketClient.java:203) 在 org.apache.commons.net.SocketClient.connect(SocketClient.java:296) 在 de.modusoft.opt.viewer.TimeSyncThread.run(TimeSyncThread.java:29) 在 java.lang.Thread.run(Thread.java:748)
host 是一个字符串和一个尝试过的“0.de.pool.ntp.org”、“ntp.xs4all.nl”。
感谢您的帮助。
【问题讨论】:
-
“普通”客户端能否从同一网络向其中任何一个服务器发出成功请求以排除其他任何问题。
-
是的,现在我可以使用
NTPUDPClient client = new NTPUDPClient(),但上面的代码仍然不起作用。 -
TimeUDPClient 和 TimeTCPClient 类连接到实现时间协议的时间服务,如 RFC 868 中所述,侦听端口 37,这与端口 123 上的 NTP 服务不同。将 NTPUDPClient 用于 NTP服务。
标签: java tcp udp ntp apache-commons-net