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

2023-11-01

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

[size=large]自己制造一个:[/size]
没有枪没有炮,我们自己造。首先看几个时间相关的协议:
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排序方式)。

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

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

[size=large]使用Runtime和process两个类时需要注意:[/size]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程序实现
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java校正电脑时间(java 时间同步) 的相关文章

随机推荐

  • 【Vue学习】使用 “scss” 时报错‘:vue-style-loader css-loader?...‘

    Vue学习 使用 scss 时报错 vue style loader css loader 错误信息 处理办法 参数配置 后续发展 新错误提示 第一次尝试解决 失败 再次尝试解决 成功 记录Vue系统学习的轨迹 2021 11 05 故事背
  • 冲刺训练Python长达6个月,整整180天换来2年经验加成+高薪工作

    1 前言 最新数据显示python在2022年前3个月企业需要增长47 平均薪资达17 5K 其中20k 30k工资达29 9 应届生 学历不限 不限经验的也可占一席之地 今天 我很荣幸能够作为一个转专业0基础自学Python并且成功上岸的
  • Spring MVC FreeMarker模板引擎与动态页面静态化全解

    目录 一 FreeMarker简介 二 第一个FreeMark示例 2 1 新建一个Maven项目 2 2 添加依赖 2 3 添加存放模板的文件夹 2 4 添加模板 2 5 解析模板 2 6 运行结果 三 动态页面静态化 3 1 动态页面静
  • flex 布局转 class 类名实现

    目录 代码 测试 flex wrap属性 nowrap flex wrap属性 wrap align items属性 baseline align content属性 flex end justify content属性 space aro
  • java double.compare_Java Double compare()方法

    Java Double compare 方法 java lang Double compare 方法比较两个指定的double值 返回整数值符号是相同的 这将通过调用被返回整数 new Double d1 compareTo new Dou
  • python lxf

    在python 2 x中 gt gt gt len u 中文 2 gt gt gt len 中文 4 gt gt gt len u 中文 encode utf 8 6 gt gt gt gt gt gt u ABC encode utf 8
  • 华为OD机试 Python [周末爬山]

    描述 小明打算周末去爬山 有一份山的地图 上面用数字表示山的高度 0表示平地 1至9表示不同的山峰高度 小明每次移动只能上下左右移动一格 并且山峰高度差不能超过k 现在他从地图的左上角出发 你能帮他找出他能爬到的最高的山峰是多高吗 还有 他
  • Python基础教程目录

    老猿Python博文目录 请注意 本部分教程基于Python 3 72版本提供 第一部分 基础知识目录 第1章 Python学习环境构建目录 第2章 Python编程基础知识目录 第3章 Python的数据类型目录 第4章 基础知识进阶目录
  • Linux通过xorg.conf强行添加显示器分辨率

    1 根据显示器商用型号 拨打官方显示器售后电话要到显示器的水平刷新率和垂直刷新率 比如我的显示器BenQ v2110 要到的的参数是 水平刷新 24 83khz 垂直刷新 50 76hz 2 用gtf命令获得自己要设置的分辨率参数名称 gt
  • 图的广度优先遍历(Java实现)

    文章收藏的好句子 这个世上 没有天上掉馅饼的灵感和等来的成就 只有日复一日的坚持和自律 目录 1 图的广度优先遍历 1 1 图的广度优先遍历基本思想 1 2 图的广度优先遍历算法步骤 1 3 图的广度优先遍历代码实现 1 图的广度优先遍历
  • Javascript 中 Var、Let 和 Const 的区别javascript 最常被问到的面试问题

    2015 年 ES6 发布 它改变了我们在 javascript 中声明和使用变量的方式 ES2015 ES6 引入了新的变量声明方法 let和const 这两种方法解决了开发人员在使用 var 时面临的问题 let 和 const 有自己
  • 激光焊接汽车PP塑料配件透光率测试仪

    随着汽车主机厂对车辆轻量化的需求越来越强烈 汽车零部件轻量化设计 制造也成为汽车零部件生产厂商的重要技术指标 零部件企业要实现产品的轻量化 在材料指定的情况下 要通过产品设计优化 产品壁厚减小和装配方式的优化来解决 使用PP材料的汽车部品由
  • DMA(STM32系列)

    DMA概述 DMA简介 直接存储器访问 DMA 用于在外设与存储器之间以及存储器与存储器之间提供高速数据传输 可以在无需任何 CPU 操作的情况下通过 DMA 快速移动数据 这样节省的 CPU 资源可供其它操作使用 DMA 控制器基于复杂的
  • Web开发

    一 什么是Web开发 Web开发其实就是Web应用开发 在 PC Personal Computer 个人计算机 刚兴起的年代 软件主要使用 C S 架构 Client Server 客户端 服务器 即应用运行在桌面上 而数据库这样的软件运
  • 高电平、低电平、高电平有效、低电平有效

    一 逻辑电平中高电平 低电平 中间电平 不定电平 概念 电平和电压是有差别的 高电平指的是与低电平相对的高电压 是电工程上的一种说法 在逻辑电平中 保证逻辑门的输入为高电平时所允许的最小输入高电平 当输入电平高于输入高电压 Vih 时 则认
  • 【wsl2 windows10/11 安装 配置cuda及pytorch】

    wsl2 windows10 11 安装 配置cuda及pytorch 参考文献 安装wsl2 ubuntu20 04 安装wsl cuda驱动 安装CUDA Tollkit 配置cudnn 连接pytorch GPU ANACONDA安装
  • 【npm】使用verdaccio和cnpm分别部署npm私服

    前言 verdaccio看起来比cnpm要轻量 反正先部署着玩玩 官网 verdaccio https github com verdaccio verdaccio 这个文档有中文的 https verdaccio org docs en
  • iOS开发 - 超详细集成 FFmpeg 步骤

    转自 https blog csdn net qq 30513483 article details 87860390 概述 网上充斥着大量的 iOS FFmpeg 编译的教程 有的时间比较早了 有的很多都没有说详细 或者有个别坑作者没有讲
  • LuckyFrameWeb测试平台(一款支持接口自动化、WEB UI自动化、APP自动化,并且支持分布式测试的全纬度免费开源测试平台)

    官网 luckyframe cn 源码地址 https gitee com seagull1985 LuckyFrameWeb 分布式测试 使用Web Client的方式 Web端负责基本信息管理展示 Client负责用例执行 任意无限扩展
  • Java校正电脑时间(java 时间同步)

    size large 写这个程序的原因 size 家里的电脑老了 主板电池没有电了 开机老是提示有错误 按了F1才能继续 无奈买了一块主板电池 换上之后不用点击F1了 但是主板的时间还是走不稳当 关机后时钟明显是有点慢 开机后系统时间老是慢