• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

C#Winform小程序:局域网设置NTP服务器、实现时间同步

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
  • 设置NTP服务器:

NTP是网络时间协议(Network Time Protocol),它是用来同步网络中各个计算机的时间的协议。

局域网不能连接Internet,可以设置一台计算机为NTP服务器。

  • 依次点击:开始---运行---regedit,进入注册表;
  • 依次展开:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer,在NtpServer项右侧键值Enablied,默认值0改为1,1为启动NTP服务器;

 

  • 依次展开:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config,在Config项右侧键值AnnounceFlags,默认值10改为5,5代表自身为可靠时间源;

  • 修改完成以上关闭注册表;
  • 命令行输入:net stop w32Time,回车,停止NTP服务;
  • 命令行输入:net start w32Time,回车,启动NTP服务;
  • 当前计算机设置NTP服务器完成。
  • 局域网内其他电脑命令行输入:net time \\10.30.100.119 /set /yes,实现时间同步,其中10.30.100.119代表NTP服务器地址。
  • C# Winform实现局域网时间同步demo:

全局变量:

//Timer
System.Timers.Timer timer = new System.Timers.Timer();
//IP
private string ipAddress;
//时间间隔
private int timeInterval;
//创建bat文件路径,如果存在,直接覆盖
private string filePath = System.Environment.CurrentDirectory + @"\timesync.bat";

页面Load方法:

private void FrmMain_Load(object sender,EventArgs e)
{
      //运行标志隐藏
      picRun.Visible = false;      
}

Run/Abort按钮点击事件:

private void btnRunAbort_Click(object sender,EventArgs e)
{
      //IP
      ipAddress = txtIP.Text.Trim();
      //Time Interval
      timeInterval = Convert.ToInt32(txtTimeInterval.Text);
      
      if (btnRunAbort.Text.Equals("开始同步"))
      {
            this.RunTimer();
      }
      else if (btnRunAbort.Text.Equals("停止同步"))
      {
            //定时器停止
            timer.Stop();
            timer = new System.Timers.Timer();

            MessageBox.Show("停止同步成功","提示");

            //运行标志隐藏
            picRun.Visible = false;
            btnRunAbort.Text = "开始同步";
      }
}

开始同步执行方法:

public void RunTimer()
{
      //创建bat文件
      FileStream fs = new FileStream(filePath, FileMode.Create,FileAccess.Write);
      StreamWriter sw = new StreamWriter(fs);
      sw.WriteLine(string.Format(@"net time \\{0} /set /yes",ipAddress));
      sw.Close();
      fs.Close();

      try
      {
            //执行时间超过10秒,强制结束
            if (!CallWithTimeOut(CommonRun,10000))
            {
                  MessageBox.Show("服务器异常!","提示");
                  return;
            }
            //服务器地址异常
            if (StringRun().EndsWith(@"/yes"))
            {
                  MessageBox.Show("服务器异常!","提示");
                  return;
            }

            MessageBox.Show("开始同步成功!","提示");
            //BeginInvoke
            SetPBState(true , "停止同步");
      }
      catch (Exception ex)
      {
            MessageBox.Show("服务器异常!","提示");
            return;
      }
      
      //timer定时器执行时间同步
      timer.Elapsed += new System.ElapsedEventHandle(TimerRun);
      timer.Enabled = true;
      timer.Interval = Convert.ToInt32(txtTimeInterval.Text) * 1000;
      timer.Start();
}

 时间同步,返回执行bat输出:

private string StringRun()
{
      ProcessStartInfo pro = new ProcessStartInfo("cmd.exe");
      pro.UseShellExecute = false;
      pro.RedirectStandardOutput = true;
      pro.RedirectStandardError = true;
      pro.CreateNoWindow = true;
      pro.FileName = filePath;
      pro.WorkingDirectory = System.Environment.CurrentDirectory;
      Process proc = new Process.Start(pro);

      StreamReader sOutput = proc.StandardOutput;
      proc.Close();
      
      string sJudge = sOutput.ReadToEnd().Trim();
      sOutput.Close();

      return sJudge;
}

时间同步:

private void CommonRun()
{
      ProcessStartInfo pro = new ProcessStartInfo("cmd.exe");
      pro.UseShellExecute = false;
      pro.RedirectStandardOutput = true;
      pro.RedirectStandardError = true;
      pro.CreateNoWindow = true;
      pro.FileName = filePath;
      pro.WorkingDirectory = System.Environment.CurrentDirectory;
      Process proc = new Process.Start(pro);

      StreamReader sOutput = proc.StandardOutput;
      proc.Close();
      
      string sJudge = sOutput.ReadToEnd().Trim();
      sOutput.Close();
}

timer定时器时间同步:

private void TimerRun(object source , System.Timers.ElapsedEventArgs e)
{
      ProcessStartInfo pro = new ProcessStartInfo("cmd.exe");
      pro.UseShellExecute = false;
      pro.RedirectStandardOutput = true;
      pro.RedirectStandardError = true;
      pro.CreateNoWindow = true;
      pro.FileName = filePath;
      pro.WorkingDirectory = System.Environment.CurrentDirectory;
      Process proc = new Process.Start(pro);

      StreamReader sOutput = proc.StandardOutput;
      proc.Close();
      
      string sJudge = sOutput.ReadToEnd().Trim();
      sOutput.Close();
}

deletegate InvokeRequired:

delegate void DelegatePBUpdate(bool b , string btnText);

public void SetPBState(bool b , string btnText)
{
      if (this.InvokeRequired)
      {
            this.BeginInvoke(new DelegatePBUpdate(SetPBState), new object[] {b , btnText});
      }
      else
      {
            picRun.Visible = true;
            btnRunAbort.Text = "停止同步";
      }
}

方法执行时间超过设定值,强制结束:

static bool CallWithTimeout(Action action, int timeoutMilliseconds)
{
      Thread threadToKill = null;
      Action wrappedAction = () =>
      {
            threadToKill = Thread.CurrentThread;
            action();
      }

      IAsyncResult result = wrappedAction.BeginInvoke(null, null);
      if (result.AsyncWaitHandle.WaitOne(timeoutMilliseconds))
      [
            wrappedAction.EndInvoke(result);
            return true;
      ]
      else
      {
            threadToKill.Abort();
            return false;
      }
}
  • 运行结果:

 

 

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap