13-案例:多任务udp聊天器(二)

1.参考代码:

在上一个案例的基础上,添加支持接收多条信息

import socket
import threading


# 定义发送数据的函数
def send_data(udp_socket):

    # 定义要发送的内容
    send_content = input("请输入要发送的内容:")

    # 请输入IP地址
    ipddr = input("请输入IP地址,格式为:xxx.xxx.xxx.xxx :")

    # 请输入端口号
    port = int(input("请输入端口号:"))

    # 把要发送的数据转换为 二进制
    send_data = send_content.encode("utf-8")

    # 发送数据
    udp_socket.sendto(send_data, (ipddr, port))
    # 测试


# 定义接收数据的函数
def recvData(udp_socket):
    while True:
        # 接收数据
        recv_data = udp_socket.recvfrom(1024)
        # 如果数据存在,则解析数据
        if recv_data:
            # 拆包,得到内容
            msg, list_port = recv_data
            # 拆包,得到msg
            msg = msg.decode("gbk")
            # 打印内容
            print(msg, list_port)
        else:
            # 数据不存在停止循环
            break


# 定义主入口函数
def main():

    # 定义套接字
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 绑定服务器客户端端口
    # udp_socket.bind(("", 7878))

    # 定义子线程并且开启
    t1 = threading.Thread(target=recvData, args=(udp_socket, ))
    # 设置守护线程
    t1.setDaemon(True)
    t1.start()

    while True:

        print("-------------------")
        print("--   1、发送数据   --")
        print("--   2、退出系统   --")
        print("-------------------")
        num = int(input("请选择功能【1/2/3】:"))

        if num < 1 or num > 3:
            print("输入不合法!,请重新输入")
        else:
            if num == 1:
                # 发送数据
                send_data(udp_socket)

            if num == 2:
                print("正在退出系统...")
                print("系统已退出")
                break


if __name__ == '__main__':
    main()