`

Java设置系统时间与网络标准时间同步

    博客分类:
  • Java
阅读更多

Java校正电脑时间(java 时间同步)
关键字: 时间同步, 修改系统时间, 获取网络时间, java 时间同步
写这个程序的原因:
家里的电脑老了,主板电池没有电了,开机老是提示有错误,按了F1才能继续。无奈买了一块主板电池。换上之后不用点击F1了,但是主板的时间还是走不稳当,关机后时钟明显是有点慢,开机后系统时间老是慢半拍。
上网找软件呗,嘿嘿。先找到一个iTimeSync程序,先说一个不爽的地方,点击校正时,不知道程序要连到什么地方去,反正出一坨连接信息,不爽。但有一个功能刚刚好是我想要的“随Windows启动,校正,退出”,O(∩_∩)O哈哈~,经过使用发现不好用,因为系统上网使用的ADSL拨号上网的,开机后软件启动了,但是拨号上网还是有一定的延时的,基本上每次都是iTimeSync启动了,进行校正时网络还没有连上,程序是出错退出的。虽然有一个每隔几个小时的自动校正的功能,可是偶不想让这个程序老是在后台运行,因为电脑开机的时候时间运行不会有太多的差异。
换了一个InternetTime,这个程序虽然简洁,“随Windows启动,校正,退出”功能依然是启动后马上校正,这样还是会失败,程序还会弹出一个什么Socket连接异常的对话框。更加不好。
总结一下这两个程序不能满足俺的需求的原因:ADSL拨号连接有一定的时延,程序在进行校正前没有对电脑是不是上网了进行判断,没有网络连接的情况下就进行了时间校正。

自己制造一个:
没有枪没有炮,我们自己造。首先看几个时间相关的协议:
1、RFC 867 :Daytime Protocol 服务器监听端口13,以固定字符串的格式将时间返回给客户端,中国授时中心的服务器貌似使用的这种协议。
2、RFC 868 :Time Protocol 服务器监听37端口,以一个32bit的整数返回当前距离1900年1月1日0点0分0秒的秒数。
3、RFC 1305:Network Time Protocol 这个协议有点复杂,没有仔细研究。
4、RFC 2030:Simple Network Time Protocol 与RFC1305相比做了一下简化。

这里选择一个最简单的 RFC868 ^_^。
先看下协议的具体内容:
When used via TCP the time service works as follows:

   S: Listen on port 37 (45 octal).

   U: Connect to port 37.

   S: Send the time as a 32 bit binary number.

   U: Receive the time.

   U: Close the connection.

   S: Close the connection.
从上面可以看出,客户端需要实现下面的功能:
1、和服务器的37端口建立一个TCP连接。
2、解析服务器返回的32bit的整数秒为一个具体的时间。解析过程也比较的简单,需要注意的就是网络字节序使用的是高位在前的方式(网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian排序方式)。

程序的实现:
1、判断计算机是否在线,通过ping www.hao123.com进行判断,没有想到更好的办法,先凑合着用了。有更好方法的同学欢迎提建议。如果ping 通了表示电脑已经在线,可以进行步骤2了;没有ping通的话,就休眠2分钟,然后重复1.
2、从实现了RFC868协议的时间服务器获取网络时间,这里找到了三个服务器"time-a.nist.gov", "time-nw.nist.gov", "time.nist.gov".对32bit的解析知道字节序就好了。
3、调用本地本机的date、time两个Dos命令修改系统日期和时间。
4、程序退出

因为Java没有相关的接口只能牺牲一下平台无关性了,只能在XP系统下使用。

使用Runtime和process两个类时需要注意:1、waitFor方法的使用,这个方法会一直阻塞直到外部命令执行结束,然后返回外部命令执行的结果。当你在一个Process上调用waitFor方法时,当前线程是阻塞的,如果外部命令无法执行结束,那么你的线程就会一直阻塞下去,这种意外会影响我们程序的执行。所以在调用date或是time命令是需要使用"cmd /c date 参数"的形式,表示执行完命令后退出Dos窗口,因为默认Dos窗口是不会自动退出的,这样就会导致前面提到的线程阻塞。
2、本地的系统对标准输入和输出所提供的缓冲池有效,所以错误的对标准输出快速的写入和从标准输入快速的读入都有可能造成子进程的锁,甚至死锁。为了处理好外部命令大量输出的情况,你要确保你的程序处理好外部命令所需要的输入或者输出。也就是说如果你调用的本地程序的输出过多,或者是输出过快,可能造成死锁。还好这个时间程序调用的两个命令不涉及大量输出的情况。如果程序涉及了大量输出,请参考下面的代码:
Process proc = rt.exec("javac");
InputStream stderr = proc.getErrorStream();
InputStreamReader isr = new InputStreamReader(stderr);
BufferedReader br = new BufferedReader(isr);
String line = null;
System.out.println("<ERROR>");
while ( (line = br.readLine()) != null)
System.out.println(line);
System.out.println("</ERROR>");
int exitVal = proc.waitFor();

分享到:
评论

相关推荐

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

    在IT行业中,时间同步是一个非常基础且重要的概念,尤其是在分布式系统...通过这种方式,开发者可以确保本地系统时间与网络标准保持一致,这对于许多需要精确时间戳的应用场景,如金融交易、日志记录等,是至关重要的。

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

    在Java程序中,通过发送请求到NTP服务器,获取当前的标准时间,然后调用nircmd执行时间设置命令,将系统时间更新为获取到的准确时间。 项目中包含的主要文件如下: 1. `点我校准时间.bat`:这是一个批处理文件,...

    同步系统时间功能实现

    "同步系统时间功能实现"这个主题聚焦于如何在Android平台上获取网络时间并更新本地系统时间,以确保时间的一致性和准确性。以下是对这个功能的详细阐述: 1. **NTP协议**:网络时间协议(Network Time Protocol, ...

    用java获取网络时间

    例如,在某些应用中,为了避免因本地系统时间设置错误而导致的问题,可以通过网络来获取一个更为可靠的时间源。本文将详细介绍如何使用Java编程语言从指定的网站(如http://www.bjtime.cn)获取网络时间。 #### ...

    windows 系统时间同步

    在Windows操作系统中,系统时间同步是一项关键功能,它确保了计算机内部时钟与全球标准时间保持一致。这对于网络通信、安全认证以及各种依赖精确时间的应用程序至关重要。在本话题中,我们将深入探讨“Windows系统...

    安卓获取系统时间和网络时间

    2. **网络时间**:网络时间通常指的是通过网络协议(如NTP - 网络时间协议)从互联网上的时间服务器获取的时间,它通常比系统时间更为准确,因为服务器会定期与全球标准时间进行同步。 在Android中获取系统时间的...

    得到网络标准时间

    在IT行业中,获取网络标准时间是一项常见的需求,特别是在需要高精度时间同步的系统中,例如金融交易、分布式计算和网络通信等。标题“得到网络标准时间”表明我们要讨论的是如何编程实现从网络获取准确的UTC(协调...

    时间同步器(附源码).zip

    它通过向NTP服务器发送时间请求,然后校正本地计算机的时间,从而达到与全球标准时间同步的目的。时间同步对于网络通信、交易记录、数据分析等领域有着重要影响,因为不准确的时间可能导致数据错误和同步问题。 ...

    联网校时 获取网络时间

    在Windows系统中,可以使用"控制面板"的"日期和时间"设置来手动配置NTP服务器,或者通过命令行工具`w32tm`来自动进行网络时间同步。例如,运行`w32tm /resync`命令将立即强制进行一次时间同步。而在Linux系统中,...

    NTPClock PC时间同步工具

    这个应用程序可能具有用户友好的界面,允许用户设置首选的时间服务器,调整同步频率,并查看当前系统时间与NTP服务器时间的偏差。 使用说明.txt文件通常包含关于如何安装、配置和使用NTPClock的详细步骤和提示。...

    自动获取国家授时中心服务器时间,并修改系统时间。自动同步时间!

    ”表明这是一个程序,其功能是连接到国家授时中心的服务器,获取最准确的时间信息,并将用户的计算机系统时间同步到这个标准时间。这样的程序对于需要高精度时间同步的场景尤其重要,比如金融交易、科学研究和网络...

    基于JAVA的航空订票系统

    系统的构建涉及到多个关键的技术领域,如JAVA Swing用于构建用户界面,JDBC用于数据库连接与数据操作,以及网络编程技术来实现服务器与客户端之间的通信。 **JAVA Swing**: Swing是JAVA提供的一个图形用户界面(GUI)...

    Java网络教学系统开题报告.doc

    系统设计需兼顾技术标准的统一与学习理念的多样性,避免单一的网络学习模式。在不断涌现的新网络学习体系中,要避免将某一理念或模式普遍化,而应根据具体需求定制解决方案。 1.2 课题意义 基于Java EE的网络教学...

    JAVA_API1.6文档(中文)

    java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的...

    Java网络程序员看Continuation

    Continuation可能涉及到如何在Java Web应用中实现和利用这种技术来优化网络请求的处理,提高系统效率。 【标签】"Continuation java java教程 java电子书 教程下载"表明这是一个关于学习和理解Continuation的资源,...

    标准时间转换器

    总的来说,标准时间转换器是一个实用的工具,它简化了Unix时间戳与人类可读日期之间的转换过程,这对于处理时间相关的IT任务至关重要。无论是在数据分析、日志分析还是日常开发工作中,这个工具都能提供高效且准确的...

    毕向东java视频同步教程

    【Java API】部分涵盖了Java标准库的使用,包括集合框架、IO流、异常处理、日期时间API等,这些都是编写Java程序时不可或缺的工具和接口。 总的来说,这套【毕向东java视频同步教程】提供了从基础到进阶的全面Java...

    会议室管理系统 java

    综上所述,基于Java的会议室管理系统是一个涵盖多方面技术的综合项目,涉及到数据库设计、GUI编程、网络通信、权限控制、文件管理等多个领域。通过这个系统,企业不仅可以提升会议室的使用效率,还能提升整体运营...

    dyh.rar_系统时间自动更新

    这个工具的主要功能是让用户的电脑时间能够自动与互联网上的标准时间服务器进行校准,确保系统时间的准确无误。这在需要精确时间记录的场景,如金融交易、科学研究或者网络通信中尤其重要。 描述中的“点击可以自动...

    获取网络服务器时间.docx

    - **时间同步**:为了确保分布式系统或网络设备之间的时间一致性,通常会采用时间同步机制。其中,最常用的一种协议是网络时间协议(Network Time Protocol,NTP)。 - **NTP协议**:NTP是一种用于在分布式时间...

Global site tag (gtag.js) - Google Analytics