写这个程序的原因:
家里的电脑老了,主板电池没有电了,开机老是提示有错误,按了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的解析知道字节序就好了。
最近发现上面的服务器不好使了,可以到下面的地址找些能用的
http://tf.nist.gov/tf-cgi/servers.cgi
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校正电脑时间(java 时间同步)”主要探讨了如何在Java中实现这一功能。 首先,Java中的日期和时间API包括`java.util.Date`、`java.util.Calendar`,以及从Java 8开始引入的更现代的`java.time`包。...
6. **Java支持**:描述中提到需要Java支持,这可能是指某些第三方时间同步应用程序或组件依赖Java运行环境。Java的跨平台特性使得基于Java开发的时间同步解决方案可以在Windows上运行。 在实际应用中,时间同步的...
在C++、C#或Java等编程语言中,源码通常由一系列的类、函数和变量定义组成,这些元素共同协作以实现时间同步功能。开发者可以通过阅读和分析源码来了解时间同步算法的具体实现,包括如何发送NTP请求,解析服务器响应...
在Android系统中,时间同步是一项重要的功能,确保设备时间的准确性和一致性。通常,Android设备会通过NITZ(Network Identity and Time Zone)服务来自动同步时间,这依赖于移动网络运营商提供的时间信息。NITZ...
通过访问网站:time.nist.gov,可以获取标准日期时间字符串,再对本地操作系统,进行时间同步操作。使用Delphi的Indy组件中的TidDayTime控件,再做好日期时间值 的分解。方便实用,本程序同时,也是我们日常使用时,...
联网校时,也称为网络时间同步,是计算机技术中一个重要的功能,主要用于确保计算机系统的时间准确无误。在日常工作中,我们可能遇到由于系统时钟漂移或初始设置不准确导致的时间错误,这对于依赖时间精确性的应用...
《NTP协议网络对时程序...通过分析源代码,可以深入理解如何用Java实现网络时间同步,以及如何使用Swing构建用户界面。尽管界面设计可能并非重点,但对NTP协议的理解和Java编程技巧的运用无疑是提升技能的有效途径。
根据提供的文件内容,这是一份关于Java记忆测试系统的详细技术报告。报告中涉及到了使用Java语言开发的...需要注意的是,在开发过程中要确保各组件之间良好的交互与数据同步,以及考虑到多线程环境下的线程安全问题。
- **概念解析**: `synchronized`是Java中的一个关键字,用于控制多线程环境下的同步访问,防止多个线程同时修改同一资源导致的数据不一致问题。 - **应用场景**: - 保护共享资源,确保同一时间只有一个线程可以访问...
总的来说,`setTime.java`代码实现的功能是利用NTP协议从指定的时间服务器获取准确时间,然后根据操作系统类型(Windows或Linux)进行时间同步,确保服务器时间与UTC保持一致。这在分布式系统、日志记录、审计跟踪...
在IT行业中,获取网络标准时间是一项常见的需求,特别是在需要高精度时间同步的系统中,例如金融交易、分布式计算和网络通信等。标题“得到网络标准时间”表明我们要讨论的是如何编程实现从网络获取准确的UTC(协调...
- **同步问题**:各个节点的时间同步是必要的,否则会影响角度和时间差的计算。可以使用分布式同步算法如GPS同步或网络同步协议。 通过Java实现的WSN APS定位系统,可以通过多线程模拟多个节点间的通信,以提高计算...
在实际应用中,如果需要确保时间的准确性,通常会比较系统时间和网络时间,并根据需要进行校正。例如,当用户调整了系统时间或者设备长时间未联网导致系统时间可能不准确时,可以调用网络时间来更新系统时间。 在...
6. Java多线程和并发:这是Java面试中的重点和难点,需要掌握线程的创建、线程的生命周期、线程同步机制(如synchronized关键字和Lock接口的使用)以及线程的通信机制(如wait()、notify()方法的使用)。 7. Java I...
3. **UTC时间**:全球协调时间(UTC)是国际原子时与地球自转校正后的结果,GPS系统以UTC作为时间基准,确保全球各地的GPS用户都能同步。 4. **寻找到几颗卫星**:GPS定位需要至少四颗卫星的信号来计算三维位置,更...
网络对时技术是确保计算机系统时间准确性的关键方法,尤其在分布式系统、金融交易、监控系统等对时间敏感的...在实际应用中,我们还需要考虑网络环境、安全因素以及性能优化等问题,以确保时间同步的准确性和稳定性。
NTP是一种互联网协议,设计用于在分布式时钟之间同步时间。它通过比较客户端和服务器之间的时钟,调整客户端的系统时钟,以确保所有设备都具有相同的时间参考。NTP的工作原理包括多个步骤:发送请求、接收响应、计算...
2. 网络延迟:网络传输中的延迟可能影响时间同步的准确性,需要考虑并校正。 3. 时区转换:如果客户端和服务器位于不同时区,需要考虑时区转换问题。 4. 服务器选择:使用多个NTP服务器进行同步,以提高可靠性,避免...
2. **时间转换**:在GPS系统中,使用的是UTC(协调世界时),这与我们日常使用的本地时间可能存在秒级别的差异,因为UTC会进行闰秒调整以保持与地球自转同步。因此,时间转换是计算定位的关键步骤,我们需要将接收到...
网络校时系统是一种确保计算机时间同步的技术,它利用互联网或局域网中的时间服务器来校正本地计算机的时间。在IT领域,保持系统时间的准确性和一致性至关重要,因为许多应用程序和服务依赖于精确的时间戳来记录和...