多线程版聊天
导入所需模块和创建套接字
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端口。
定义发送消息函数
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地址和端口号。
定义接收消息函数
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
的文件中。
创建发送线程和接收线程 综上所述,这段代码实现了一个多线程聊天程序。
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
文件中。