用python程序同步时间(python实例二十七)

目录

1.认识Python

2.环境与工具

2.1 python环境

2.2 Visual Studio Code编译

3.时间同步

3.1代码构思

3.2 服务端

3.3 客户端

3.4 运行结果

4.总结


1.认识Python

Python 是一个高层次的结合了解释性、编译性、互动性和面向对象脚本语言

Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字或标点符号,它具有比其他语言更有特色的语法结构。

2.环境与工具

2.1 python环境

在Windows上使用命令行窗口查看所安装的python版本

python --version

2.2 Visual Studio Code编译

Visual Studio Code是一款由微软开发且跨平台的免费源代码编辑器。该软件以扩展的方式支持语法高亮、代码自动补全、代码重构功能,并且内置了命令行工具和Git 版本控制系统。

3.时间同步

3.1代码构思

部分设备没有实时同步时间的功能,只要可以连接网络,就可以使用python代码来同步另一台设备的时间。

服务端向公共NTP网络时间服务器请求标准时间,然后由服务端想请求时间的客户端发送该时间,进而实现客户端时间同步。

3.2 服务端

服务端:用grt_time()函数获取标准时间,然后返回该时间,发开端口接收客户端信息,通过UDP协议发送常规时间格式的信息到客户端。

import socket
import time
import ntplib

# 该函数向NTP服务器请求时间,并返回该时间值
def get_time():
    try:
        ntpclient_obj = ntplib.NTPClient()
        ret_time = ntpclient_obj.request('ntp6.aliyun.com')
        now_time = ret_time.tx_time
        return now_time
    except Exception as e:
        print(f"获取时间失败: {e}")
        return None

if __name__ == '__main__':
    # 创建一个UDP套接字
    server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 绑定到指定的端口
    server.bind(('127.0.0.1', 9999))
    print('时间同步服务器启动,等待客户端请求...')
    while True:
        try:
            # 接收客户端请求
            rec_str, addr = server.recvfrom(1024)
            if rec_str.decode('utf-8') == 'get_time':
                # 获取时间
                now_time = get_time()
                if now_time:
                    std_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(now_time))
                    # 发送时间
                    server.sendto(std_time.encode('utf-8'), addr)
                    print('发送时间给客户端:', std_time)
                else:
                    error_message = "无法获取时间"
                    server.sendto(error_message.encode('utf-8'), addr)
        except Exception as e:
            print(f"处理请求时出错: {e}")

3.3 客户端

客户端:每隔一端时间想服务端发送请求,收到服务器返回的标准时间,然后使用os.system()函数对本系统的时间进行更改。

import socket
import time
import os
import platform

def set_system_time(date_str, time_str):
    try:
        if platform.system() == 'Linux' or platform.system() == 'Darwin':
            os.system(f'sudo date -s "{date_str} {time_str}"')
        elif platform.system() == 'Windows':
            os.system(f'date {date_str}')
            os.system(f'time {time_str}')
        else:
            print('不支持的操作系统')
    except Exception as e:
        print(f'设置系统时间时出错: {e}')

if __name__ == '__main__':
    # 创建一个UDP套接字
    client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 服务器地址和端口
    server_address = ('127.0.0.1', 9999)
    client.connect(server_address)
    print('客户端已经启动,连接到服务器:', server_address)
    # 获取当前时间
    while True:
        # 每隔20s同步一次
        time.sleep(20)
        client.sendto('get_time'.encode('utf-8'), server_address)
        # 接收服务器返回的时间
        data, server = client.recvfrom(1024)
        print('接收服务器时间:', data.decode('utf-8'))
        # 假设服务器返回的时间格式为 'YYYY-MM-DD HH:MM:SS'
        datetime_str = data.decode('utf-8')
        date_now, time_now = datetime_str.split(' ')
        # 设置系统时间
        set_system_time(date_now, time_now)

3.4 运行结果

4.总结

时间同步程序,只要服务端的时间正常,处在同一局域网的客户端就可以通过该程序同步时间,该程序在一些开发板的使用过程中用处很大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值