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

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

多线程版聊天

导入所需模块和创建套接字

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文件中。

相关文章
|
1天前
|
监控 开发者 Python
Python中记录程序报错信息的实践指南
Python中记录程序报错信息的实践指南
10 1
|
1天前
|
机器学习/深度学习 数据挖掘 程序员
Python学习难度的具体标准
Python学习难度因个人编程背景、目标、资源和学习能力而异。对有编程经验者来说,Python的简单语法使其易上手;而对于新手,理解基础概念可能需更多时间。不同应用领域(如Web开发、数据分析)的学习曲线也不同。丰富的学习资源适应各种水平,但选择合适资源很重要。成功学习Python需要逻辑思维、问题解决能力及毅力。总的来说,Python学习难度因人而异,需结合自身条件评估。
9 0
|
1天前
|
存储 索引 Python
python数据结构知识学习
【5月更文挑战第6天】Python提供四种核心数据结构:列表(List)——可变有序集合,支持索引和切片;元组(Tuple)——不可变有序集合;字典(Dictionary)——键值对结构,通过键访问值;集合(Set)——无序不重复元素集合,支持数学运算。此外,Python允许自定义数据结构,如链表、树、图,以适应不同问题需求。
8 0
|
5天前
|
监控 测试技术 持续交付
Python自动化测试代理程序可用性
总之,通过编写测试用例、自动化测试和设置监控系统,您可以确保Python自动化测试代理程序的可用性,并及时发现和解决问题。这有助于提供更可靠和高性能的代理服务。
11 4
|
7天前
|
Python
简单的 Python 计算器程序
这是一个简单的Python计算器程序,实现了加、减、乘、除功能。用户选择运算类型及输入两个数字后,程序依据选择调用相应函数进行计算并显示结果。若输入非法,程序显示错误信息。
22 3
|
7天前
|
机器学习/深度学习 分布式计算 物联网
【Python机器学习专栏】联邦学习:保护隐私的机器学习新趋势
【4月更文挑战第30天】联邦学习是保障数据隐私的分布式机器学习方法,允许设备在本地训练数据并仅共享模型,保护用户隐私。其优势包括数据隐私、分布式计算和模型泛化。应用于医疗、金融和物联网等领域,未来将发展更高效的数据隐私保护、提升可解释性和可靠性的,并与其他技术融合,为机器学习带来新机遇。
|
7天前
|
机器学习/深度学习 自然语言处理 搜索推荐
【Python机器学习专栏】迁移学习在机器学习中的应用
【4月更文挑战第30天】迁移学习是利用已有知识解决新问题的机器学习方法,尤其在数据稀缺或资源有限时展现优势。本文介绍了迁移学习的基本概念,包括源域和目标域,并探讨了其在图像识别、自然语言处理和推荐系统的应用。在Python中,可使用Keras或TensorFlow实现迁移学习,如示例所示,通过预训练的VGG16模型进行图像识别。迁移学习提高了学习效率和性能,随着技术发展,其应用前景广阔。
|
7天前
|
机器学习/深度学习 算法 前端开发
【Python机器学习专栏】集成学习中的Bagging与Boosting
【4月更文挑战第30天】本文介绍了集成学习中的两种主要策略:Bagging和Boosting。Bagging通过自助采样构建多个基学习器并以投票或平均法集成,降低模型方差,增强稳定性。在Python中可使用`BaggingClassifier`实现。而Boosting是串行学习,不断调整基学习器权重以优化拟合,适合弱学习器。Python中可利用`AdaBoostClassifier`等实现。示例代码展示了如何在实践中运用这两种方法。
|
7天前
|
机器学习/深度学习 算法 数据挖掘
【Python机器学习专栏】关联规则学习:Apriori算法详解
【4月更文挑战第30天】Apriori算法是一种用于关联规则学习的经典算法,尤其适用于购物篮分析,以发现商品间的购买关联。该算法基于支持度和置信度指标,通过迭代生成频繁项集并提取满足阈值的规则。Python中可借助mlxtend库实现Apriori,例如处理购物篮数据,设置支持度和置信度阈值,找出相关规则。
|
7天前
|
机器学习/深度学习 算法 前端开发
【Python机器学习专栏】集成学习算法的原理与应用
【4月更文挑战第30天】集成学习通过组合多个基学习器提升预测准确性,广泛应用于分类、回归等问题。主要步骤包括生成基学习器、训练和结合预测结果。算法类型有Bagging(如随机森林)、Boosting(如AdaBoost)和Stacking。Python中可使用scikit-learn实现,如示例代码展示的随机森林分类。集成学习能降低模型方差,缓解过拟合,提高预测性能。