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

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获取网络时间

    ### 使用Java获取网络时间 在开发过程中,为了确保时间数据的准确性与同步性,开发者有时会需要从网络上获取标准时间。例如,在某些应用中,为了避免因本地系统时间设置错误而导致的问题,可以通过网络来获取一个...

    java 获取标准北京时间

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

    java获取网络音乐文件时长

    在Java编程中,获取网络音乐文件的时长是一项常见的任务,尤其在开发音乐播放器或者处理音频流的应用中。下面将详细介绍三种不同的方法来实现这一功能。 ### 方法一:使用`BufferedInputStream`和`AudioInputStream...

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

    以下是使用ffmpeg4java获取本地视频时长的步骤: 1. 添加ffmpeg4java库到项目中,可以通过Maven或Gradle引入依赖。 2. 初始化FFmpeg工具: ```java FFmpeg ffmpeg = FFmpeg.getInstance(); ``` 3. 创建一个File对象...

    java 获取服务器时间

    在Java编程中,获取服务器时间通常涉及到网络通信和图形用户界面(GUI)的开发。这里我们主要关注两个关键部分:使用UDP协议进行C/S模式的通信以及构建GUI来展示服务器返回的时间。 首先,UDP(User Datagram ...

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

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

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

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

    转 Java校正电脑时间(java 时间同步)

    然而,它们并不直接支持与网络时间服务器(NTP,Network Time Protocol)进行同步。 要校正电脑时间,通常我们需要使用NTP协议。NTP是一个用于同步网络中不同计算机时钟的协议,它通过比较服务器和客户端的时间戳来...

    Android获取网络时间

    在Android应用开发中,获取网络时间是一项常见的需求,主要用于确保应用程序中的时间信息准确无误,避免用户手动修改设备时间导致的潜在问题。本教程将详细讲解如何在Android中实现网络时间的获取,并提供相关的代码...

    java自动同步时间(Windows) 修改版 (已编译,有源码)

    Java自动同步时间是一种常见需求,特别是在服务器管理中,确保系统时间准确无误是至关重要的,因为时间不一致可能会导致各种问题,如网络通信错误、安全认证失败等。本项目提供了一个修改版的Java程序,实现了在...

    Java从网络取得文件源码整理

    在Java编程语言中,从网络获取文件是一项常见的任务,它涉及到网络编程和I/O操作。以下是一些关于如何使用Java从网络下载文件的关键知识点: 1. **URL类**:Java中的`java.net.URL`类是表示统一资源定位符的对象,...

    android通过访问网络获取网络时间,并修改系统时间

    在Android平台上,获取网络时间并校准系统时间是一项常见的任务,尤其对于那些需要精确时间同步的应用来说至关重要。本文将深入探讨如何实现这一功能,并提供相关的编程知识点。 首先,要获取网络时间,通常我们会...

    java获取某地天气

    在Java编程中,获取某个地方的天气信息通常涉及到网络请求和数据解析,这通常通过调用第三方API来实现。以下是一些相关的关键知识点: 1. **HTTP请求**:获取天气信息首先需要向提供天气预报服务的网站或者API发送...

    java下载网络图片

    在Java编程中,下载网络图片是一项常见的任务,尤其在数据抓取、网页爬虫或构建图形界面应用时。本教程将深入讲解如何使用Java实现多线程下载网络图片,并涉及日志记录和网络速度监控。 首先,我们需要了解HTTP协议...

    java获取服务器基本信息的方法

    以下是一些使用Java获取服务器基本信息的关键知识点: 1. **第三方库Sigar**: Sigar(System Information Gatherer and Reporter)是由Hyperic公司开发的一个跨平台的系统监控库。它提供了丰富的API来获取各种操作...

    java获取公网IP

    总结来说,Java获取公网IP地址主要依赖于网络请求和第三方服务的配合。`ExternalIpAddressFetcher.java` 类提供了一个简单的方法来实现这个功能,通过向Amazon AWS提供的公共IP检查服务发起HTTP请求,并解析返回的IP...

    获取网络服务器时间.docx

    其中,最常用的一种协议是网络时间协议(Network Time Protocol,NTP)。 - **NTP协议**:NTP是一种用于在分布式时间服务器与客户端之间进行时间同步的互联网标准协议。它能够提供高精度的时间同步服务,适用于...

    用java做的测试服务器带宽项目(原创)

    综上所述,这个"用java做的测试服务器带宽项目"涵盖了Java网络编程、TCP/IP通信、多线程、异常处理、定时任务、结果展示等多个核心知识点,是一个全面的网络性能测试工具。对于学习和理解Java在网络应用中的实际运用...

    java实验7 网络编程

    本实验主要涉及Java 网络编程的基础知识,包括使用InetAddress类获取主机的IP地址和主机名称,使用Socket和ServerSocket类实现C/S通信。 一、 InetAddress类 InetAddress类是Java中用于表示Internet协议(IP)地址...

    java 编写的 时间显示屏 源码

    对于时间显示屏,我们需要使用Java的日期和时间API来获取和处理当前时间。 1. **日期和时间API**:在Java 8及以后版本中,`java.time`包提供了更现代和直观的方式来处理日期和时间。我们可以使用`LocalTime`类来...

Global site tag (gtag.js) - Google Analytics