大锤python日记(利用子线程优化UDP客户端)

93 阅读1分钟

一个使用线程实现UDP客户端的示例代码。该示例可以在子线程中执行收发消息操作,主线程不会被阻塞。

import socket
import threading

# 定义远程IP地址和端口号
REMOTE_IP = '127.0.0.1'
PORT = 8000

# 定义套接字对象
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 定义发送消息函数
def send_msg():
    while True:
        msg = input('Please enter your message: ')
        # 发送数据
        sock.sendto(msg.encode(), (REMOTE_IP, PORT))

# 定义接收消息函数
def recv_msg():
    while True:
        data, addr = sock.recvfrom(1024)
        msg = data.decode()
        print(f'Received message "{msg}" from {addr}')

# 创建发送消息子线程并启动
send_thread = threading.Thread(target=send_msg)
send_thread.start()

# 创建接收消息子线程并启动
recv_thread = threading.Thread(target=recv_msg)
recv_thread.start()

# 主线程等待子线程结束
send_thread.join()
recv_thread.join()

# 关闭套接字对象
sock.close()

上面的代码创建了一个UDP客户端,能够输入消息并通过套接字对象发送给服务端,并能够接收服务端返回的消息并打印出来。代码中使用了两个子线程,分别用于发送消息和接收消息,主线程不会被阻塞,因此可以随时输入或显示消息。注意,在UDP通信中,由于无连接的特性,可能会导致发送的消息先到达接收方,因此在代码中应该尽可能保证发送和接收是独立的线程执行,以免出现一些不可预测的问题。