`
BrokenDreams
  • 浏览: 249028 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
68ec41aa-0ce6-3f83-961b-5aa541d59e48
Java并发包源码解析
浏览量:97951
社区版块
存档分类
最新评论

Java获取网络时间

 
阅读更多
       最近项目中涉及到一个时间验证的问题,需要根据当前时间来验证业务数据是否过期。所以直接写代码如下:
new java.util.Date().getTime();


        结果测试的时候出现了问题,怎么验证都是过期。后来发现是服务器主机时间不对。也就是说如果服务器时间不准确或者被篡改,那么验证这部分会出现问题。所以决定采用获取网络当前时间来代替获取系统当前时间
        搜索了一下,原来获取网络时间有一个协议:Network Time Protocol(NTP: 网络时间协议 )。
        协议有了,那么java有没有相关实现呢。当然也有了。apache的commons-net包下面有ntp的实现。主要的类是:
org.apache.commons.net.ntp.NTPUDPClient


org.apache.commons.net.ntp.TimeInfo

看下用法,NTPUDPClient中有方法:
public TimeInfo getTime(InetAddress host, int port) throws IOException


public TimeInfo getTime(InetAddress host) throws IOException

第二个重载方法是用协议规范默认端口:123。

看下具体实现代码:
/***
     * Retrieves the time information from the specified server and port and
     * returns it. The time is the number of miliiseconds since
     * 00:00 (midnight) 1 January 1900 UTC, as specified by RFC 1305.
     * This method reads the raw NTP packet and constructs a <i>TimeInfo</i>
     * object that allows access to all the fields of the NTP message header.
     * <p>
     * @param host The address of the server.
     * @param port The port of the service.
     * @return The time value retrieved from the server.
     * @exception IOException If an error occurs while retrieving the time.
     ***/
    public TimeInfo getTime(InetAddress host, int port) throws IOException
    {
        // if not connected then open to next available UDP port
        if (!isOpen())
        {
            open();
        }

        NtpV3Packet message = new NtpV3Impl();
        message.setMode(NtpV3Packet.MODE_CLIENT);
        message.setVersion(_version);
        DatagramPacket sendPacket = message.getDatagramPacket();
        sendPacket.setAddress(host);
        sendPacket.setPort(port);

        NtpV3Packet recMessage = new NtpV3Impl();
        DatagramPacket receivePacket = recMessage.getDatagramPacket();

        /*
         * Must minimize the time between getting the current time,
         * timestamping the packet, and sending it out which
         * introduces an error in the delay time.
         * No extraneous logging and initializations here !!!
         */
        TimeStamp now = TimeStamp.getCurrentTime();

        // Note that if you do not set the transmit time field then originating time
        // in server response is all 0's which is "Thu Feb 07 01:28:16 EST 2036".
        message.setTransmitTime(now);

        _socket_.send(sendPacket);
        _socket_.receive(receivePacket);

        long returnTime = System.currentTimeMillis();
        // create TimeInfo message container but don't pre-compute the details yet
        TimeInfo info = new TimeInfo(recMessage, returnTime, false);

        return info;
    }

       大概过程就是想目标网络地址发包来获取网络时间,具体细节由协议来规范。
所以我们还需要来确定网络地址,继续搜索,发现网络上有时间服务器,也叫授时服务器。我们的用智能手机的时间是不是通过这种方式来同步的呢?
       找到了这样一些服务器地址:
中国时间网
       国外的
NIST Internet Time Servers

代码例子:
	public static void main(String[] args) {
		try {
			NTPUDPClient timeClient = new NTPUDPClient();
			String timeServerUrl = "time-a.nist.gov";
			InetAddress timeServerAddress = InetAddress.getByName(timeServerUrl);
			TimeInfo timeInfo = timeClient.getTime(timeServerAddress);
			TimeStamp timeStamp = timeInfo.getMessage().getTransmitTimeStamp();
			DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
			System.out.println(dateFormat.format(timeStamp.getDate()));
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}


输出:
2013-04-02 11:01:08


可调整本机时间,然后观察输出是否正确。
分享到:
评论
2 楼 evilseed 2014-09-20  
似乎有些时间服务器一直都没有返回数据.
导致执行到第六行时会阻塞.
timeClient.getTime(timeServerAddress);
有遇到过这个问题么?
有没有解决的办法?
1 楼 skynet_java 2013-07-08  
需要什么包。?能请教下嘛 我邮箱:think_world@foxmail.com

相关推荐

    用java获取网络时间

    所以获取网络上面的时间 获取的是 这个网站上面的时间 http://www.bjtime.cn URL url=new URL("http://www.bjtime.cn");//取得资源对象 URLConnection uc=url.openConnection();//生成连接对象 uc.connect(); /...

    java 获取标准北京时间

    java 获取标准北京时间 标准北京时间 北京时间 网络时间 internet时间

    java获取网络音乐文件时长

    java获取网络音乐文件时长,自己整理的三种方法

    JAVA获取本地视频或者网络URL的时长.zip

    JAVA获取本地视频或者网络URL的时长。附代码和Jar包

    java实现windows机器系统时间同步网络时间例子

    java类获取网络时间操作cmd命令(打成jar包了,就一个sysTimeTest类,30行代码用反编译工具一看就懂,网上也有很多例子)。然后打成jar包,windows批处理操作,单次同步更新windows系统时间,每天定时同步更新windows...

    简单、快捷、准确地获取互联网时间

    如何迅速地获取到准确的网络时间,以便在系统中实现诸如时间同步的操作,相信有许多人都与我有同样的需求。但是,遍查百度搜索,有说国外的时间服务器一般都很慢的,国内的又比较难找,种种说法、种种代码,最后都...

    java 获取服务器时间

    基于 UDP 编写一个C/S 模式的双向网络通信程序。 功能要求: 客户向服务器发送一个请求消息,服务器收到后返回当前主机 时间。客户端要求基于 GUI编写,

    Java代码实现时间服务器.rar

    Java代码实现时间服务器,让客户端设备通过服务器校准和获取最新的时间,和Windows时间自动更新的功能类似。  int port=13; //端口号  ServerSocket serverSocket; //服务器套接字  public TimeServer(){  ...

    Java创建一个简单的时间服务器.rar

    可以通过这个网络时间服务器了解一些套按字、输入流以及缓冲区方面的相关基础知识。服务器创建部分,可参考如下代码:  serverSocket=new ServerSocket(port); //实例化套接字  System.out.println("start server ...

    java源码包---java 源码 大量 实例

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    【强2】30个java工具类

    [工具类] 获得汉字拼音首字母的java工具类.java.txt [工具类] 获取绝对路径 .java.txt [工具类] 记录log日志文件的工具类 .java.txt [工具类] 连接数据库的工具类 .java.txt [工具类] 使用Java程序来实现HTTP文件的...

    JAVA_API1.6文档(中文)

    java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 java.util.concurrent 在并发编程中很常用的实用工具类...

    Java2实用教程提取码

    Java语言不仅可以用来开发大型的应用程序,而且特别适合于在Internet上应用开发,Java已成为网络时代最重要的编程语言之一。 第1章 Java入门 第2章 标识符、关键字和数据类型 第3章 运算符、表达式和语句 第4章 类、...

    脚本语言获得系统时间

    在java中准确的获得系统时间

    JAVA上百实例源码以及开源项目

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    java源码包4

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    JAVA上百实例源码以及开源项目源代码

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    java源码包3

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    30个java工具类

    [工具类] 获得汉字拼音首字母的java工具类.java.txt [工具类] 获取绝对路径 .java.txt [工具类] 记录log日志文件的工具类 .java.txt [工具类] 连接数据库的工具类 .java.txt [工具类] 使用Java程序来实现HTTP文件的...

    Java开发技术大全(500个源代码).

    listConstructors.java 利用反射机制获取构造器列表 listFields.java 利用反射机制获取成员属性列表 listMethods.java 利用反射机制获取成员方法列表 loadClass.java 动态装载一个类 Shape.java 一个用于测试的...

Global site tag (gtag.js) - Google Analytics