结合上一讲的python多线程编程的思想和UDP聊天室的内容,编写代码实现基于UDP的多任务聊天室
示例代码:
import socket,threading
def udp_recv(udp_socket):
while True:
recv_data,server = udp_socket.recvfrom(1024)
print("接收到来自%s的信息:%s"%(server,recv_data.decode("utf-8")))
def udp_send(udp_socket,server):
while True:
send_msg = input("请输入要发送的信息:\n ")
if send_msg == "exit":
udp_socket.close()
break
udp_socket.sendto(send_msg.encode("utf-8"),server)
def main():
"""完成udp聊天器的整体控制"""
# 1. 创建套接字
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 2. 绑定本地信息
udp_socket.bind(("",7788))
server_ip = input("请输入接收服务器的IP: \n")
server_port = int(input("请输入要接收服务器的PORT: \n"))
server = (server_ip,server_port)
# 创建多线程
t1 = threading.Thread(target=udp_recv,args=(udp_socket,))
t2 = threading.Thread(target=udp_send,args=(udp_socket,server))
t1.setDaemon(True) # 设置t1为守护线程,当t2和主线程执行完毕,t2也会被终止
# 3. 接收信息
t1.start()
t2.start()
if __name__=="__main__":
main()
值得注意:在t1线程执行之前,通过t1.setDaemon(True)
或者t1.daemon=True
设置接收信息的线程为守护线程,守护线程有一个特点,当其他非守护线程结束时(本例中非守护线程是主线程和发送信息的线程),守护线程就会自动被终止——这就实现了在子线程中关闭其他子线程的功能。
python解释器的 垃圾回收机制 就是典型的守护线程,当程序中所有的守护线程和其他非守护线程执行完毕,垃圾回收机制就没有继续执行的必要了。
refrence
[1] 守护线程
[2] 守护线程的library