`

客户端同步服务器时间

    博客分类:
  • J2EE
 
阅读更多

客户端同步服务器时间

 

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域中客户端时间与服务器时间不同步的解决办法

    ### AD域中客户端时间与服务器时间不同步的解决办法 #### 概述 在Active Directory(AD)域环境中,确保所有客户端与服务器之间的时间同步至关重要。时间的不同步不仅会影响用户的日常操作体验,还可能导致安全...

    windows设置时间服务器以及客户端同步.rar

    在“压缩包子文件的文件名称列表”中提到的文件可能是这样一个批处理脚本,用于修改注册表设置以保持客户端与服务器的时间同步。 在客户端计算机上,可以使用以下步骤来配置时间同步: 1. 将服务器配置为权威时间...

    同步Socket(客户端与服务器端)

    同步Socket,也称为阻塞Socket,是网络编程中一种基础且重要的通信机制,主要用于客户端与服务器之间的数据交换。在客户端-服务器模型中,同步Socket允许应用程序通过发送请求并等待响应来执行通信。以下是对同步...

    NTP服务器的配置以及客户端自动同步

    NTP服务器的配置以及客户端自动同步 NTP(Network Time Protocol)服务器的配置...NTP服务器的配置和客户端自动同步是计算机网络中非常重要的一部分,它可以使得计算机的时间保持同步,避免时间不同步带来的各种问题。

    简单帧同步客户端和服务器端

    "简单帧同步客户端和服务器端"项目就是基于这一技术构建的,允许多个玩家通过遥杆操控角色,实现同步的游戏体验。 帧同步的核心原理是将每一帧的游戏状态发送到所有客户端,这样每个客户端都可以根据接收到的状态...

    客户端和服务端时间同步

    客户端和服务端时间同步,实现了时间同步问题

    Indy控件实现服务器与客户端的时间同步

    比如,防止用户修改当前时间,造成数据逻辑混乱,客户端使用的时间应为服务器时间。 如何处理呢,我们可以使用Delphi Indy组件中的 TIdDayTimeServer和TIdDayTime一对组件。 TIdDayTimeServer用于服务器端,...

    练习多线程客户端与服务器端

    通过创建线程,程序可以在同一时间做更多的事情,比如,服务器可以一边接收新的连接请求,一边处理已有的连接。 2. **Java中的多线程**: 在Java中,我们可以使用`Thread`类或者实现`Runnable`接口来创建线程。...

    windows配置时间同步ntp服务器客户端

    Windows 配置时间同步 NTP 服务器客户端 Windows 配置时间同步 NTP 服务器客户端是指在 Windows 环境下创建和应用 NTP 时间服务器的过程。NTP(Network Time Protocol)是一种用于同步计算机时间的网络协议,能够...

    FreeRadius客户端和服务器配置

    FreeRadius 客户端和服务器配置 FreeRadius 是一个开源的 RADIUS 服务器,广泛应用于网络认证、授权和记帐(AAA)领域。FreeRadius 客户端和服务器配置是实现网络认证和授权的关键步骤。本文将详细介绍 FreeRadius ...

    C++实现时间同步服务器

    通过注册表,实时本机同时作为时间服务器,或者客户端,实现时间同步。 实现平台,Windows2000,XP,Win7。可以与任何一台服务器相连,也可以自己也自己相连。需要完全C++代码的加QQ:182392810

    windows_2008_R2上建立NTP_Server和客户端实现时间同步

    要设置客户端的时间同步,需要输入要同步服务器的 IP 地址,然后点确认。 * 在注册表中找到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\W32Time\TimeProviders\NtpClient,修改 SpecialPollInterval 的...

    TCP客户端与服务器连接

    2. **SYN+ACK(同步确认)**:服务器接收到客户端的SYN包后,如果同意连接,会回应一个SYN+ACK包,序列号设为B,确认号设为A+1,表示服务器收到了序列号A,并期望下一个数据包的序列号是A+1。此时,服务器进入SYN_...

    局域网时间同步(服务器+客户端)

    3. **时间校准**:客户端根据接收到的时间信息调整自己的系统时钟,确保与服务器时间保持一致。 4. **周期性同步**:为了保持准确性,客户端可能会定期(例如每小时或每天)重复这个过程,以补偿时钟漂移。 5. **...

    MFC客户端客户端和服务器通信

    在这个场景下,我们讨论的是如何利用MFC实现客户端-服务器间的TCP网络通信。 TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输协议,它保证了数据的有序和无损传输。在MFC中实现TCP通信,主要...

    利用socket实现客户端服务器之间简单通信

    1. 第一次握手:客户端发送一个带有SYN(同步序列编号)标志的数据包给服务器,请求建立连接。 2. 第二次握手:服务器接收到SYN包后,回复一个SYN+ACK(确认)的数据包,表示同意建立连接,并且会设置自己的序列号和...

    C#网络编程Demo(客户端+服务器端+同步+异步).zip

    本Demo包含了客户端和服务器端的实现,同时展示了同步和异步两种通信方式,这对于理解C#网络编程的深度和广度非常有帮助。 首先,我们来探讨客户端和服务器端在网络编程中的作用。客户端通常发起连接请求,向服务器...

    NTP时间同步客户端程序C#源码

    3. 客户端接收到响应后,计算出服务器时间与本地时间的差异,并据此调整本地系统时间。 在C#中,实现NTP客户端通常会用到System.Net.NetworkInformation命名空间中的NetworkInformation类,或者直接使用第三方库如...

Global site tag (gtag.js) - Google Analytics