客户端同步服务器时间
import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.Socket; import java.net.UnknownHostException; import java.util.Calendar; import java.util.Date; import java.util.TimeZone; import java.util.logging.Level; import java.util.logging.Logger; /** * SyncTime 获取原子钟的时间,并设置为系统时间 * @author Administrator */ public class SyncTime { private static int sleepMinutes = 0; private static final long EPOCH_OFFSET_MILLIS; private static final String[] hostName = {"time-a.nist.gov", "time-nw.nist.gov", "time.nist.gov"}; static { Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT")); // Java使用的参照标准是1970年,而时间服务器返回的秒是相当1900年的,算一下偏移 calendar.set(1900, Calendar.JANUARY, 1, 0, 0, 0); EPOCH_OFFSET_MILLIS = Math.abs(calendar.getTime().getTime()); } public static void main(String[] args) { GetWebTime(); } private static Date getNetDate(String hostName) { Date date = null; long result = 0; try { Socket socket = new Socket(hostName, 37); BufferedInputStream bis = new BufferedInputStream(socket.getInputStream(), socket.getReceiveBufferSize()); int b1 = bis.read(); int b2 = bis.read(); int b3 = bis.read(); int b4 = bis.read(); if ((b1 | b2 | b3 | b3) < 0) { return null; } result = (((long) b1) << 24) + (b2 << 16) + (b3 << 8) + b4; date = new Date(result * 1000 - EPOCH_OFFSET_MILLIS); socket.close(); } catch (UnknownHostException ex) { Logger.getLogger(SyncTime.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(SyncTime.class.getName()).log(Level.SEVERE, null, ex); } return date; } /** * 通过ping命令判断是否离线 * @return */ public static boolean offLine() { Runtime run = Runtime.getRuntime(); try { Process process = run.exec("ping www.hao123.com"); InputStream s = process.getInputStream(); BufferedReader bis = new BufferedReader(new InputStreamReader(s)); String str = bis.readLine(); while (str != null) { if (str.startsWith("Reply from")) { return false; } str = bis.readLine(); } process.waitFor(); } catch (IOException ex) { Logger.getLogger(SyncTime.class.getName()).log(Level.SEVERE, null, ex); } catch (InterruptedException ex) { Logger.getLogger(SyncTime.class.getName()).log(Level.SEVERE, null, ex); } return true; } /** * 通过调用本地命令date和time修改计算机时间 * @param date */ private static void setComputeDate(Date date) { Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT+8")); c.setTime(date); int year = c.get(Calendar.YEAR); int month = c.get(Calendar.MONTH) + 1; int day = c.get(Calendar.DAY_OF_MONTH); int hour = c.get(Calendar.HOUR_OF_DAY); int minute = c.get(Calendar.MINUTE); int second = c.get(Calendar.SECOND); c.setTime(new Date()); int year_c = c.get(Calendar.YEAR); int month_c = c.get(Calendar.MONTH) + 1; int day_c = c.get(Calendar.DAY_OF_MONTH); int hour_c = c.get(Calendar.HOUR_OF_DAY); int minute_c = c.get(Calendar.MINUTE); String ymd = year + "-" + month + "-" + day; String time = hour + ":" + minute + ":" + second; try { // 日期不一致就修改一下日期 if (year != year_c || month != month_c || day != day_c) { String cmd = "cmd /c date " + ymd; Process process = Runtime.getRuntime().exec(cmd); process.waitFor(); } // 时间不一致就修改一下时间 if (hour != hour_c || minute != minute_c) { String cmd = "cmd /c time " + time; Process process = Runtime.getRuntime().exec(cmd); process.waitFor(); } } catch (IOException ex) { Logger.getLogger(SyncTime.class.getName()).log(Level.SEVERE, null, ex); } catch (InterruptedException ex) { Logger.getLogger(SyncTime.class.getName()).log(Level.SEVERE, null, ex); } } public static void GetWebTime() { // 检测电脑是否在线 while (offLine() && sleepMinutes < 30) { try { Thread.sleep(120000); sleepMinutes += 2; } catch (InterruptedException ex) { Logger.getLogger(SyncTime.class.getName()).log(Level.SEVERE, null, ex); } } // 30分钟还没有联线,表示就不上网了,退出吧 if (sleepMinutes >= 30) { System.exit(0); } // 从网络上获取时间 Date date = null; for (int i = 0; i < hostName.length; i++) { date = getNetDate(hostName[i]); if (date != null) { break; } } // 修改本机时间 if (date != null) { System.out.println("原子钟时间:"+date); setComputeDate(date); } } }
import java.io.IOException; import java.util.Calendar; import java.util.Date; import java.util.TimeZone; public class ServerHostTime { /** * lance * * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub } /** * 通过调用本地命令date和time修改计算机时间 * * @param date */ @SuppressWarnings("unused") private static void setComputeDate(Date date) { Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT+8")); c.setTime(date); int year = c.get(Calendar.YEAR); int month = c.get(Calendar.MONTH) + 1; int day = c.get(Calendar.DAY_OF_MONTH); int hour = c.get(Calendar.HOUR_OF_DAY); int minute = c.get(Calendar.MINUTE); int second = c.get(Calendar.SECOND); c.setTime(new Date()); int year_c = c.get(Calendar.YEAR); int month_c = c.get(Calendar.MONTH) + 1; int day_c = c.get(Calendar.DAY_OF_MONTH); int hour_c = c.get(Calendar.HOUR_OF_DAY); int minute_c = c.get(Calendar.MINUTE); String ymd = year + "-" + month + "-" + day; String time = hour + ":" + minute + ":" + second; try { // 日期不一致就修改一下日期 if (year != year_c || month != month_c || day != day_c) { String cmd = "cmd /c date " + ymd; Process process = Runtime.getRuntime().exec(cmd); process.waitFor(); } // 时间不一致就修改一下时间 if (hour != hour_c || minute != minute_c) { String cmd = "cmd /c time " + time; Process process = Runtime.getRuntime().exec(cmd); process.waitFor(); } } catch (IOException ex) { ex.getStackTrace(); } catch (InterruptedException ex) { ex.getStackTrace(); } } }
相关推荐
"域客户端同步时间服务器组策略设置" 在Windows域中,时间同步对于域客户端和服务器的正常运行至关重要。在某些情况下,客户端可能无法与时间服务器同步,这时候需要对域客户端同步时间服务器组策略进行设置。下面...
### AD域中客户端时间与服务器时间不同步的解决办法 #### 概述 在Active Directory(AD)域环境中,确保所有客户端与服务器之间的时间同步至关重要。时间的不同步不仅会影响用户的日常操作体验,还可能导致安全...
在“压缩包子文件的文件名称列表”中提到的文件可能是这样一个批处理脚本,用于修改注册表设置以保持客户端与服务器的时间同步。 在客户端计算机上,可以使用以下步骤来配置时间同步: 1. 将服务器配置为权威时间...
同步Socket,也称为阻塞Socket,是网络编程中一种基础且重要的通信机制,主要用于客户端与服务器之间的数据交换。在客户端-服务器模型中,同步Socket允许应用程序通过发送请求并等待响应来执行通信。以下是对同步...
NTP服务器的配置以及客户端自动同步 NTP(Network Time Protocol)服务器的配置...NTP服务器的配置和客户端自动同步是计算机网络中非常重要的一部分,它可以使得计算机的时间保持同步,避免时间不同步带来的各种问题。
"简单帧同步客户端和服务器端"项目就是基于这一技术构建的,允许多个玩家通过遥杆操控角色,实现同步的游戏体验。 帧同步的核心原理是将每一帧的游戏状态发送到所有客户端,这样每个客户端都可以根据接收到的状态...
客户端和服务端时间同步,实现了时间同步问题
比如,防止用户修改当前时间,造成数据逻辑混乱,客户端使用的时间应为服务器时间。 如何处理呢,我们可以使用Delphi Indy组件中的 TIdDayTimeServer和TIdDayTime一对组件。 TIdDayTimeServer用于服务器端,...
通过创建线程,程序可以在同一时间做更多的事情,比如,服务器可以一边接收新的连接请求,一边处理已有的连接。 2. **Java中的多线程**: 在Java中,我们可以使用`Thread`类或者实现`Runnable`接口来创建线程。...
FreeRadius 客户端和服务器配置 FreeRadius 是一个开源的 RADIUS 服务器,广泛应用于网络认证、授权和记帐(AAA)领域。FreeRadius 客户端和服务器配置是实现网络认证和授权的关键步骤。本文将详细介绍 FreeRadius ...
Windows 配置时间同步 NTP 服务器客户端 Windows 配置时间同步 NTP 服务器客户端是指在 Windows 环境下创建和应用 NTP 时间服务器的过程。NTP(Network Time Protocol)是一种用于同步计算机时间的网络协议,能够...
要设置客户端的时间同步,需要输入要同步服务器的 IP 地址,然后点确认。 * 在注册表中找到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\W32Time\TimeProviders\NtpClient,修改 SpecialPollInterval 的...
通过注册表,实时本机同时作为时间服务器,或者客户端,实现时间同步。 实现平台,Windows2000,XP,Win7。可以与任何一台服务器相连,也可以自己也自己相连。需要完全C++代码的加QQ:182392810
2. **SYN+ACK(同步确认)**:服务器接收到客户端的SYN包后,如果同意连接,会回应一个SYN+ACK包,序列号设为B,确认号设为A+1,表示服务器收到了序列号A,并期望下一个数据包的序列号是A+1。此时,服务器进入SYN_...
3. **时间校准**:客户端根据接收到的时间信息调整自己的系统时钟,确保与服务器时间保持一致。 4. **周期性同步**:为了保持准确性,客户端可能会定期(例如每小时或每天)重复这个过程,以补偿时钟漂移。 5. **...
在这个场景下,我们讨论的是如何利用MFC实现客户端-服务器间的TCP网络通信。 TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输协议,它保证了数据的有序和无损传输。在MFC中实现TCP通信,主要...
1. 第一次握手:客户端发送一个带有SYN(同步序列编号)标志的数据包给服务器,请求建立连接。 2. 第二次握手:服务器接收到SYN包后,回复一个SYN+ACK(确认)的数据包,表示同意建立连接,并且会设置自己的序列号和...
本Demo包含了客户端和服务器端的实现,同时展示了同步和异步两种通信方式,这对于理解C#网络编程的深度和广度非常有帮助。 首先,我们来探讨客户端和服务器端在网络编程中的作用。客户端通常发起连接请求,向服务器...
3. 客户端接收到响应后,计算出服务器时间与本地时间的差异,并据此调整本地系统时间。 在C#中,实现NTP客户端通常会用到System.Net.NetworkInformation命名空间中的NetworkInformation类,或者直接使用第三方库如...