4-多任务UDP聊天器

结合上一讲的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

猜你喜欢

转载自blog.csdn.net/weixin_43721070/article/details/121761534
今日推荐