python学习之使用UDP和多线程实现一个群聊天室

版权声明:浅弋、璃鱼的原创 https://blog.csdn.net/qq_35709559/article/details/82154174

        在学习UDP的时候,想着试一试能不能搞一个命令窗口的udp聊天工具,因为udp的广播机制,所以就想着干脆直接搞一个群聊的吧。不过最后搞来搞去,命令窗口下使用多线程,没有做出什么好看整洁的“图形化”界面,凑合着用吧,毕竟是一个练习的学习型的小玩意。有时间把打印格式再搞一搞,争取以后能好看一点。

        不说了,上代码(先来一个V1.0):

#!/usr/bin/python3
# -*-coding:utf-8-*-

"""使用udp实现群聊9091聊天室"""

# 导包
import socket, threading

port = 9090
ip_host = "192.168.14.255"

# 发送消息
def send_msg(udp_socket,address):
    send_content = input(">")
    # 发送
    udp_socket.sendto(send_content.encode('gbk'),address)

# 接受消息
def recv_msg(udp_socket):
    while True:
        recv_data, ip_port = udp_socket.recvfrom(1024)
        print("来自:" + str(ip_port))
        print(recv_data.decode('gbk'))


if __name__ == '__main__':
    # 创建udp套接字
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 设置广播
    udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, True)
    # 绑定端口
    udp_socket.bind(('', port))
    # 设置目标地址
    # addr = ("192.168.14.255", 9090)

    # 创建接受数据的线程
    recv_thread = threading.Thread(target=recv_msg, args=(udp_socket,))
    # 设置成为守护进程
    recv_thread.setDaemon(True)
    recv_thread.start()

    while True:
        # 接受用户指令
        option = input("请输入功能:1.发送\t2.退出\n")
        if option == '1':
            addr = (ip_host, port)
            send_msg(udp_socket, addr)
        elif option == '2':
            break

    # 关闭流
    udp_socket.close()

再来一个版本(v1.2):

#!/usr/bin/python3
# -*-coding:utf-8-*-

"""使用udp实现群聊9091群聊天室"""

# 导包
import socket, threading
port = 9091
ip_host = "192.168.14.255"  # 广播地址
# 创建套接字
def create_socket():
    # 创建udp套接字
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 绑定端口
    udp_socket.bind(('', port))
    print(udp_socket)

    # 设置广播
    udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, True)
    return udp_socket

# 发送消息
def send_msg(udp_socket):
    while True:
        send_content = input(">")
        # 发送
        udp_socket.sendto((send_content+"\r\n").encode('gbk'),(ip_host,port))

# 接受消息
def recv_msg(udp_socket):
    while True:
        recv_data, ip_port = udp_socket.recvfrom(1024)
        print(("来自:" + str(ip_port)).rjust(50))
        print(recv_data.decode('gbk').rjust(50))
        print("-"*80)


if __name__ == '__main__':
    
    udp_socket = create_socket()

    # 创建接受数据的线程
    recv_thread = threading.Thread(target=recv_msg, args=(udp_socket,))
    # 设置成为守护进程
    recv_thread.setDaemon(True)
    recv_thread.start()

    send_thread = threading.Thread(target=send_msg, args=(udp_socket,))
    send_thread.start()

    # # 关闭流
    # udp_socket.close()

猜你喜欢

转载自blog.csdn.net/qq_35709559/article/details/82154174