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

        在学习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()

 

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浅弋、璃鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值