`

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_API1.6文档(中文)

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

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

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

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

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    java开源包11

    DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列...

    java开源包6

    DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列...

    java开源包9

    DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列...

    java开源包4

    DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列...

    java开源包101

    DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列...

    java开源包5

    DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列...

    Java 1.6 API 中文 New

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

    java开源包8

    DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列...

    java开源包10

    DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列...

    java开源包3

    DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列...

    java开源包1

    DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列...

    java api最新7.0

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

    JavaAPI1.6中文chm文档 part1

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

    Java资源包01

    DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列...

    java基础案例与开发详解案例源码全

    9.5 Java语言国际化时间获取与计算238 9.6 Random类和Math类240 9.7 本章习题243 第10章 10.1 异常概述246 10.2 使用try和catch捕获异常..2 50 10.3 使用throw和throws引发异常252 10.4 finally关键字255 10.5 ...

    java jdk实列宝典 光盘源代码

    telnet客户端,访问系统的telnet服务实质上是与telnet服务建立socket连接,默认的telnet服务的端口是23,TelnetClient.java; UDP编程,包括收发udp报文; 聊天室服务器端,Chatserver.java;聊天室客户端,...

Global site tag (gtag.js) - Google Analytics