一直想实现一个go语言版本的ntp客户端程序,今天终于鼓捣出来了,还是在家里学习效率高啊,代码如下:
package main
import (
"fmt"
"github.com/beevik/ntp"
"github.com/kardianos/service"
"github.com/mako2kano/systime"
"os"
"time"
)
func main(){
//以下为启动windows或者linux 服务相关的配置及初始化代码
svcConfig := &service.Config{
Name: "goNtpClient", //服务名称
DisplayName: "goNtpClient", //服务说明
Description: "自动校时程序",
Dependencies: []string{}, //无依赖
}
prg := &program{}
s, err := service.New(prg, svcConfig)
if err != nil {
fmt.Println(err.Error())
return
}
if len(os.Args) > 1 {
if os.Args[1] == "install" {
s.Install()
fmt.Println("服务安装成功")
return
}
if os.Args[1] == "remove" {
s.Uninstall()
fmt.Println("服务卸载成功")
return
}
fmt.Println("请使用程序名称 install 命令安装为服务,或者程序名称 remove 命令卸载服务!")
return
}
err = s.Run() //会触发Start()函数的执行
if err != nil {
fmt.Println(err.Error())
return
}
}
type program struct{} //用于windows/linux service服务控制
func (p *program) Start(s service.Service) error {
// Start should not block. Do the actual work async.
go p.run()
return nil
}
func (p *program) run() {
time.LoadLocation("Asia/Shanghai")
for {
syncDateTime()
time.Sleep(time.Minute*30)
}
}
func (p *program) Stop(s service.Service) error {
// Stop should not block. Return with a few seconds.
return nil
}
func syncDateTime() {
ntpServerIp:="ntp4.aliyun.com"
tm, err := ntp.Time(ntpServerIp)
if nil!=err {
fmt.Println(err.Error())
return
}
//fmt.Println(tm.Format("2006-01-02 15:04:05"))
err = systime.SetLocalTime(&tm)
if nil!=err {
fmt.Println(err.Error())
return
}
}