[0030] 本发明充分利用现有HTTP协议中的机制,无需增加客户端和服务器之间额外通信开销即可有效解决客户端时间和服务器时间的同步问题,将本地主机与目标主机之间的同步精确度提高到毫秒级别。
[0031] 作为本发明的一个实施例,采用Java编程语言以Windows作为运行环境,主要由预处理模块、时钟误差计算模块、时钟校准模块组成。
[0032] 预处理模块为了将获取的本地主机时间精确到毫秒,使用Windows多媒体时钟:调用Windows系统API的timeGetTime函数,从而获得从Windows启动开始所经历的时间(精度为毫秒),进而得到本地主机精确到毫秒的准确时间。
[0033] 假设本地主机与目标主机之间的时间误差为Δt,Δt可定义为两部分:Δt=Δt1+Δt2,其中Δt1为秒级别的误差,Δt2为毫秒级别的误差。假定测算过程中毫秒级误差Δt2的误差范围是t1至t2,且计算过程中t1、t2精确到毫秒。为了计算方便,本发明中本地主机发送时间、接收到响应时的本地主机时间和目标主机发送响应时间均采用UTC格式存储,即自1970年1月1日0时0分0秒以来的毫秒数。
[0034] 下面结合附图对本发明作进一步描述。
[0035] 如图1所示,为本发明中时钟误差计算方法,包括如下步骤:
[0036] 步骤一:设置毫秒级时钟误差下限为t1,毫秒级时钟误差上限为t2,发送HTTP请求的毫秒级时间间隔为t,t=(t1+t2)/2;本发明中,毫秒级时钟误差下限t1=0ms,毫秒级时钟误差上限t2=1000ms,发送HTTP请求的毫秒级时间间隔t=500ms。
[0037] 步骤二:利用URLConnection的实例化对象调用getOutputStream函数,在本地时钟到达整数秒时,本地主机向目标主机发送第一个HTTP请求,通过timeGetTime函数获得精确到毫秒的本地主机发送时间sendTime1,利用URLConnection的实例化对象调用getInputStream()函数,得到接收到第一次响应时的本地主机时间backTime1,目标主机发送响应的时间是通过解析接收到的HTTP响应中的Date字符串得到的,即利用URLConnection的实例化对象调用getDate获取目标主机发送响应的时间serverTime1。getDate是从HTTP的请求头中获取目标主机的时间,即使目标网站的页面没有时间显示也能获取目标网站的时间,精确到秒。
[0038] 步骤三:等待一个时间间隔t,即0.5s,使本地主机向目标主机发送第二个HTTP请求,采用与步骤二同样的调用方式获取:本地主机发送时间sendTime2、接收到第二次响应时的本地主机时间backTime2以及目标主机发送响应的时间serverTime2。
[0039] 步骤四:根据sendTime1、backTime1计算网络单向时延OWD,OWD=(backTime1-sendTime1)/2;
[0040] 步骤五:通过时钟误差计算模块计算秒级误差Δt1:Δt1等于backTime1-serverTime1-OWD,取计算结果的值向上取整赋值给Δt1。例如:计算结果为0.5s,则Δt1=0;计算结果为-1.5s,则Δt1=-1。
[0041] 步骤六:如图2所示,若Δt1>0,表示本地主机时间比目标主机时间快,则转到步骤七;
[0042] 如图3所示,若Δt1≤0,表示本地主机时间比目标主机时间慢或者同步,则转到步骤八;
[0043] 步骤七:若serverTime1≠serverTime2,则毫秒级误差Δt2在t1至t之间,将t赋给t2,再将新的t1、t2的中点作为新的t,即t2=t,t=(t1+t2)/2;
[0044] 若serverTime1==serverTime2,则毫秒级误差Δt2在t至t2之间,将t赋给t1,再将新的t1、t2的中点作为新的t,即t1=t,t=(t1+t2)/2;跳转到步骤九;
[0045] 步骤八:若serverTime1≠serverTime2,则毫秒级误差Δt2在t至t2之间,将t赋给t1,再将新的t1、t2的中点作为新的t,即t1=t,t=(t1+t2)/2;
[0046] 若serverTime1==serverTime2,则毫秒级误差Δt2在t1至t之间,将t赋给t2,再将新的t1、t2的中点作为新的t,即t2=t,t=(t1+t2)/2;跳转到步骤九;
[0047] 步骤九:若t1≠t2,则跳转至步骤二;若t1==t2,则Δt2=t1,进入下一步;
[0048] 步骤六至步骤九是根据新的误差范围利用二分法的原理确定新的时间间隔,以新的时间间隔向目标主机发送2次请求获得新的探测数据,重复时钟误差计算模块的步骤进一步缩小误差,经过10次左右的计算得到两机之间的毫秒级误差Δt2,从而获得真实误差Δt,进入步骤十。
[0049] 步骤十:若Δt1>0,输出时钟误差Δt=Δt1+Δt2;若Δt1≤0,输出时钟误差Δt=Δt1-Δt2,至此完成时钟误差的计算。
[0050] 步骤十一:根据时钟误差调整本地主机时间,消除本地主机与目标主机之间的时间差,实现本地主机与目标主机的毫秒级时钟校准。
[0051] 选择一台与本地主机不在同一网段的远程机器测试结果,经过8次左右的交互误差趋于平稳,最终测得毫秒级误差为334ms,利用时钟校准模块将本地主机机与目标主机进行同步,同步后测试发现两台机器之间的误差为2ms,此2ms时间是由网络延时造成的并且误差的范围在毫秒级别完全可以接受。
[0052] 时钟校准模块,调用系统函数修改系统的时间,具体为Runtime类调用exec(String command)函数设置系统时间,使本地主机机和目标主机之间达到毫秒级别的同步。
[0053] 以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和变形,这些改进和变形也应视为本发明的保护范围。