【从零学习python 】82. 基于多线程的聊天程序实现

2024-02-29 20:28:42 浏览数 (1)

多线程版聊天

导入所需模块和创建套接字
代码语言:javascript复制
import socket
import threading

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('0.0.0.0', 8080))
  • 导入所需模块:socket用于网络通信,threading用于创建和管理线程。
  • 创建一个UDP套接字对象,使用IPv4地址族和数据报传输方式。
  • 将套接字绑定到本地所有IP地址的8080端口。
定义发送消息函数
代码语言:javascript复制
def send_msg():
    ip = input('请输入您要聊天的ip:')
    port = int(input('请输入对方的端口号:'))
    while True:
        msg = input('请输入聊天内容:')
        s.sendto(msg.encode('utf-8'), (ip, port))
        if msg == "bye":
            ip = input('请输入您要聊天的ip:')
            port = int(input('请输入对方的端口号:'))
  • 定义一个名为send_msg的函数,用于发送消息。该函数运行在子线程中。
  • 通过用户输入获取目标IP地址和端口号。
  • 进入一个循环,不断读取用户输入的聊天内容。
  • 使用socket.sendto()方法将消息编码为UTF-8,并发送给指定的IP地址和端口号。
  • 如果用户输入的消息为"bye",则重新获取目标IP地址和端口号。
定义接收消息函数
代码语言:javascript复制
def recv_msg():
    while True:
        content, addr = s.recvfrom(1024)
        print('接收到了{}主机{}端口的消息:{}'.format(addr[0], addr[1], content.decode('utf-8')),file=open('history.txt', 'a', encoding='utf-8'))
  • 定义一个名为recv_msg的函数,用于接收消息。该函数运行在子线程中。
  • 进入一个循环,不断接收数据报和发送方的地址。
  • 将接收到的内容解码为UTF-8,并打印出发送方的IP地址、端口号以及消息内容。
  • 将接收到的消息追加写入到名为history.txt的文件中。
创建发送线程和接收线程 综上所述,这段代码实现了一个多线程聊天程序。
代码语言:javascript复制
send_thread = threading.Thread(target=send_msg)
recv_thread = threading.Thread(target=recv_msg)

send_thread.start()
recv_thread.start()
  • 创建一个名为send_thread的线程,目标函数为send_msg,用于发送消息。
  • 创建一个名为recv_thread的线程,目标函数为recv_msg,用于接收消息。
  • 启动发送线程和接收线程的执行。

该段代码实现了一个多线程聊天程序。通过创建两个线程,分别用于发送消息和接收消息,实现了同时进行消息发送和接收的功能。用户可以输入目标IP地址和端口号,并发送和接收消息。接收到的消息会被打印并保存到history.txt文件中。

0 人点赞