当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用TimeTCPClient从公共时间服务器获取时间》经验,为你挑选了2个好方法。

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

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

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



1> Friek..:

NTP是与时间协议不同的协议.NTP服务器仅通过端口UDP/123进行通信.时间服务器使用TCP/37(TimeTCPClient似乎正确实现).

如果您想获得远程时间,请使用适当的服务器(ntp.xs4all.nl似乎正在侦听时间端口).



2> marcolopes..:

您可以使用正确的方法:

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());

    }


这不完全正确.`date date = new Date(info.getReturnTime());`应该是`Date date = new Date(info.getMessage().getTransmitTimeStamp().getTime());`以获取返回的时间而不是系统时间.[来源](http://stackoverflow.com/a/14356839/2302499)(已测试并确认).
推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有