一个使用线程实现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通信中,由于无连接的特性,可能会导致发送的消息先到达接收方,因此在代码中应该尽可能保证发送和接收是独立的线程执行,以免出现一些不可预测的问题。