python 实现ntp server 和客户端,实测可用

server 代码

# -*- coding: utf-8 -*-
import time
import socket
import threading

def handle_client(client_socket):
    while True:
        # 获取当前时间并发送给客户端
        current_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        client_socket.send(current_time.encode())
        time.sleep(3)

def server():
    # 创建套接字
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 绑定地址和端口
    server_address = ('127.0.0.1', 5000)
    server_socket.bind(server_address)
    # 监听连接
    server_socket.listen(5)  # 可以同时处理 5 个连接请求

    print("Server is listening...")

    while True:
        # 等待客户端连接
        client_socket, client_address = server_socket.accept()
        print(f"Connected by {client_address}")

        # 为每个客户端创建一个新线程进行处理
        client_thread = threading.Thread(target=handle_client, args=(client_socket,))
        client_thread.start()

if __name__ == "__main__":
    server()

client 代码

# -*- coding: utf-8 -*-

import time
import socket
import subprocess
import platform
import ctypes

# 从 ctypes 中导入 WINFUNCTYPE 和 wintypes
from ctypes import WINFUNCTYPE, wintypes
class SYSTEMTIME(ctypes.Structure):
    _fields_ = [
        ("wYear", ctypes.c_ushort),
        ("wMonth", ctypes.c_ushort),
        ("wDayOfWeek", ctypes.c_ushort),
        ("wDay", ctypes.c_ushort),
        ("wHour", ctypes.c_ushort),
        ("wMinute", ctypes.c_ushort),
        ("wSecond", ctypes.c_ushort),
        ("wMilliseconds", ctypes.c_ushort)
    ]
def set_system_time_windows(time_str):
    time_struct = time.strptime(time_str, "%Y-%m-%d %H:%M:%S")
    system_time = SYSTEMTIME()
    system_time.wYear = time_struct.tm_year
    system_time.wMonth = time_struct.tm_mon
    system_time.wDay = time_struct.tm_mday
    system_time.wHour = time_struct.tm_hour
    system_time.wMinute = time_struct.tm_min
    system_time.wSecond = time_struct.tm_sec

    # 设置系统时间
    ctypes.windll.kernel32.SetSystemTime(ctypes.byref(system_time))

def client():
    # 创建套接字
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 连接服务器
    server_address = ('127.0.0.1', 5000)
    client_socket.connect(server_address)

    while True:
        # 接收服务器发送的时间
        received_time = client_socket.recv(1024).decode()
        print(f"Received time from server: {received_time}")

        # 设置系统时间
        set_system_time_windows(received_time)

        time.sleep(3)

if __name__ == "__main__":
    client()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要在Python实现WebSocket服务端和客户端,可以使用Python websockets库。该库基于asyncio异步IO构建,提供了基于协程的API。 首先,你需要安装websockets库,可以使用pip命令进行安装:pip3 install websockets。 对于服务端的实现,你可以创建一个Python文件,并引入websockets和asyncio模块。使用async关键字定义一个async函数,例如叫做handle_client,这个函数将处理客户端连接并处理接收到的消息。在函数内部,使用async with语句创建一个WebSocket服务器对象,传入服务器的地址和端口。然后,使用一个无限循环来等待并处理客户端连接。在循环中,使用await关键字接收客户端发送的消息,并根据需要进行处理。最后,使用await关键字向客户端发送消息。下面是一个简单的示例代码: ```python import asyncio import websockets async def handle_client(websocket, path): async for message in websocket: # 处理接收到的消息 # ... # 发送消息给客户端 response = "Hello, client!" await websocket.send(response) start_server = websockets.serve(handle_client, 'localhost', 8765) asyncio.get_event_loop().run_until_complete(start_server) asyncio.get_event_loop().run_forever() ``` 对于客户端实现,你可以创建一个Python文件,并引入websockets和asyncio模块。使用async关键字定义一个async函数,例如叫做connect_to_server,这个函数将连接到服务器并发送消息。在函数内部,使用async with语句创建一个WebSocket客户端对象,传入服务器的地址和端口。然后,使用await关键字向服务器发送消息,并等待服务器的响应。最后,打印接收到的消息。下面是一个简单的示例代码: ```python import asyncio import websockets async def connect_to_server(): async with websockets.connect('ws://localhost:8765') as websocket: message = "Hello, server!" await websocket.send(message) response = await websocket.recv() print(response) asyncio.get_event_loop().run_until_complete(connect_to_server()) ``` 需要注意的是,以上示例只是一个简单的示例,你可以根据自己的需求进行修改和扩展。另外,确保你的Python版本是大于等于3.6的版本,因为websockets库对于较低版本的Python可能会有兼容性问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三希

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值