socket网络程序设计实验三,客户端与服务器端一对一聊天(基于python3.7、PyQt5)

python GUI软件界面设计 使用python的tkinter模拟“友善串口助手”界面 使用python 自带的GUI库tkinter,模仿“友善串口助手”设计一个串口工具,工具使用了稍微复杂的界面,tkinter库中常用的控件大部分在应用中有调用。所以用本文记录各控件的使用方法,方便各网友查询、参考。 注:代码中只有UI部分,仅供各位网友参考tkinter库的使用。有部分个人编写的模块未在此上传,若直接拷贝以下代码需稍作修... 阅读详情

上一篇文章socket网络程序设计实验二简单演示了socket编程的大致框架,这次我们加强一下功能,实现客户端与服务器端一对一聊天

本次实验的一个难点是多线程和PyQt界面的实时刷新并显示接收到的信息

老规矩,先上图!

效果1

一、设计客户端和服务器端界面

和前两篇文章一样,先用Py Designer分别设计服务器和客户端的界面ui,并分别保存为server_4.ui和client_4.ui。
可以参考我的这样布局摆放:

服务器端:

服务器端界面

客户端:

客户端界面

二、Py UIC转化为py文件并补全代码

找到刚才保存的两个ui文件,右键,-> Extarl tools -> Py UIC,就会帮我们自动生成.py文件了,在两个.py文件代码的最后加上:

if __name__ == '__main__':
    app = QApplication(sys.argv)
    MainWindow = QMainWindow()
    ui = Ui_Dialog()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

前面加上:

import sys
import time
import socket
import threading  # 多线程
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMainWindow, QApplication, QFileDialog
from PyQt5.QtCore import QThread, pyqtSignal, QObject

到此为止,可以试运行了,会出现界面,但是现在是没有任何功能的

三、增加代码实现功能

这里因为客户端和服务器端差别较大,我们分开实现客户端和服务器端的功能

(一)服务器端

编程思路:

PyQt界面的显示就是一个主线程,因此要实现socket的并发运行,肯定要创建新进程。

先给类加个初始化方法吧,定义一下类内成员变量:

    def __init__(self):
        self.s = socket.socket()
        self.c = None
        self.msg_send = ''
        self.msg_rec = ''

当点击监听按钮时,启动新线程来监听socket;

    def listen_button(self):        # 监听按钮
        add1 = self.lineEdit.text()
        add2 = self.lineEdit_2.text()
        self.s.bind((add1, int(add2)))
        self.s.listen()
        print('正在监听。。。')
        self.textBrowser.setText('开始监听。。。')
        t1 = threading.Thread(target=self.accept_socket)
        t1.start()

当接收到客户端请求连接时,启动新线程来循环接收消息

    def accept_socket(self):     # 接收socket连接
        while 1:
            print('等待连接中。。。')
            self.c, addr = self.s.accept()
            print('已连接')
            break
        t2 = threading.Thread(target=self.rec_msg)
        t2.start()

    def rec_msg(self):      # 接受信息
        while 1:
            print('等待接受消息中。。。')
            msg = self.c.recv(1024).decode('GB2312')
            print('收到消息', msg)
            self.msg_rec += msg
            print(self.msg_rec)
            # time.sleep(2)

定义断开按钮:

    def break_button(self):     # 断开按钮
        self.s.close()

定义发送按钮:

    def send_button(self):      # 发送按钮
        MSG = '[' + time.ctime() + ']:' +self.lineEdit_3.text() + '\n'
        self.c.send(MSG.encode('GB2312'))
        print('已发送:', MSG)
        self.msg_send += MSG
        self.textBrowser.setText(self.msg_send) # 更新显示的消息
        self.lineEdit_3.setText('') # 发送后清空内容

再将按钮的对应事件关联起来,在retranslateUi方法最后加上:

        self.lineEdit.setText("127.0.0.1")
        self.lineEdit_2.setText("21567")
        self.pushButton_3.clicked.connect(self.send_button)
        self.pushButton_4.clicked.connect(self.listen_button)
        self.pushButton_5.clicked.connect(self.break_button)
        self.pushButton_3.setShortcut(QtCore.Qt.Key_Return)  # 设置回车键快捷发送

Ok,目前位置就已经完成了基本的功能,但是有一点,就是接收到的消息的显示问题,
把self.textBrowser_2.setText(self.msg_rec)放在rec_msg方法中,程序会在接受消息的时候卡死,因为PyQt常规情况下,只有点击按钮才会做出相应发生改变,我们总不能为了接收消息,设置一个刷新键一直点吧。。
百度了一下需要用到PyQt5的QObject和QThread,直接看代码,
新建一个类,继承QObject:

class BackendThread(QObject):   # 用来实时更新显示收到的消息
    update_date = pyqtSignal(str)  # 定义信号类型

    # 定义方法
    def run(self):
        while True:
            self.update_date.emit('')
            time.sleep(1)	# 设置间隔时间

然后在retranslateUi方法最下面加上:

		# 调用刚才的自定义类
        self.backend = BackendThread()
        self.backend.update_date.connect(self.handleDisplay)    # 连接信号事件
        self.thread = QThread()     # 创建进程
        self.backend.moveToThread(self.thread)
        self.thread.started.connect(self.backend.run)
        self.thread.start()

定义handleDisplay方法,显示收到的消息:

    def handleDisplay(self):      # 显示收到的信息
        self.textBrowser_2.setText(self.msg_rec)

完成!

服务器端就可以了,接下来再实现客户端

(二)客户端

编程思路:

有了服务器端的经验,客户端就照着做就好了
初始化方法:

    def __init__(self):
        self.s = socket.socket()
        self.msg_send = ''
        self.msg_rec = ''

定义连接按钮的方法:

    def connect_button(self):       # 连接按钮
        add1 = self.lineEdit.text()
        add2 = self.lineEdit_2.text()
        self.s.connect((add1, int(add2)))
        print('已连接到服务器')
        self.textBrowser.setText('连接成功~')
        t = threading.Thread(target=self.rec_msg)
        t.start()

定义断开按钮方法:

    def break_button(self):     # 断开按钮
        self.s.close()
        print('已关闭服务器')

定义发送按钮方法:

    def send_button(self):      # 发送按钮
        MSG = '[' + time.ctime() + ']:' +self.lineEdit_3.text() + '\n'
        self.s.send(MSG.encode('GB2312'))
        print('已发送:', MSG)
        self.msg_send += MSG
        self.textBrowser.setText(self.msg_send)
        self.lineEdit_3.setText('')

定义接收消息方法:

    def rec_msg(self):      # 接受消息
        while 1:
            print('等待接受消息中。。。')
            msg = self.s.recv(1024).decode('GB2312')
            print('收到消息', msg)
            self.msg_rec += msg
            print(self.msg_rec)

定义实时显示接受的消息方法:

    def handleDisplay(self):      # 显示收到的消息
        self.textBrowser_2.setText(self.msg_rec)

然后导入服务器端代码中我们自定义的类:

from test4.server_4 import BackendThread    # 导入自定义类

最后在retranslateUi方法最后加上:

self.lineEdit.setText("127.0.0.1")
        self.lineEdit_2.setText("21567")
        self.pushButton_3.clicked.connect(self.send_button)
        self.pushButton_4.clicked.connect(self.connect_button)
        self.pushButton_5.clicked.connect(self.break_button)
        self.pushButton_3.setShortcut(QtCore.Qt.Key_Return)  # 回车键发送

        # 调用自定义类,同server_4
        self.backend = BackendThread()
        self.backend.update_date.connect(self.handleDisplay)
        self.thread = QThread()     # 创建进程
        self.backend.moveToThread(self.thread)
        self.thread.started.connect(self.backend.run)
        self.thread.start()

至此,客户端也完成了

运行效果:

服务器端和客户端一起运行,先服务器监听,然后客户端连接,就可以互发信息了
运行效果11
运行效果12
运行效果13

完整代码已上传在我的github上:https://github.com/LiePy/socket.git

Python实现socket简单一对一聊天 1.socket流程介绍 这里主要介绍以TCP为主的socket,即基于连接的会话,流程如图,解释如下: step1 服务端需要创建一个socket对象;用bind()函数绑定一对用于连接的IP地址和端口号port;然后用listen()函数侦听打开的端口;用accept()函数接收来自客服端的请求,此时返回两个参数,一个是客户端的ip/port, 一个是客户端与服务端之间建立的连接,后续的通... 阅读详情

相关推荐

网络聊天工具 - 基于Python开发

本文档详细介绍了一个基于Python和PyQt5开发的局域网P2P聊天应用的技术架构与实现细节。该应用支持文字聊天、文件传输、视频通话等核心功能,采用TCP/UDP混合协议实现可靠的消息传输和实时的视频流传输。类型常量说明用途TEXTMSG_TEXT文本消息聊天文字传输FILEMSG_FILE文件消息文件传输通知IMAGEMSG_IMAGE图片消息图片传输通知VIDEO_CALL视频通话请求发起视频通话VIDEO_END结束视频通话结束通话通知CONNECT连接通知。

wujinpeng0508的专栏 308

python网络编程与使用TCP协议实现聊天室

网络编程 网络编程从大的方面说就是对信息的发送到接收,中间传输为物理线路的作用。 网络编程最主要的工作就是在发送端把信息通过规定好的协议进行组装包,在接收端按照规定好的协议把包进行解析,从而提取出对应的信息,达到通信的目的。中间最主要的就是数据包的组装,数据包的过滤,数据包的捕获,数据包的分析,当然最后再做一些处理,代码、开发工具、数据库、服务器架设和网页设计等。 套接字( Socket)是网络通信的关键,套接字也是应用程序和网络协议的接口。套接字由IP和端口号组成。网络层通信主要由TCP和UDP两种通讯。

个人学习笔记库,一篇一篇记录成长的足迹 6268

python TCP服务器v1.4 - 客户端连接服务器异常(异常情况分类)处理

套接字socket.connect(...)返回的异常处理.

m0_60394896的博客 2万+

python gui界面 tcp_带Tkinter GUI的Twisted TCP服务器

最近我一直在尝试使用Twisted(python库)来制作TCP聊天服务器/客户端。我让服务器运行得很好,但是当我试图向服务器添加基于Tkinter的GUI时,事情变得很奇怪。一旦用户连接到服务器,就会向GUI发送一条消息。然而,在这个过程中,某个地方出了问题,出现了一个冗长的错误,其要点是Tkinter由于一个无限循环而耗尽了堆栈空间。我把我的代码放在下面。我遇到麻烦的函数是应用程序写入(文本)...

weixin_36166558的博客 573

Qt/C++原生集成通义千问API:桌面应用智能化实践

HTTP API是现代软件实现云端服务调用的核心技术,它定义了客户端与服务器之间的通信协议与数据格式。其工作原理基于请求-响应模型,通过标准化的方法、状态码和头部信息,实现了跨平台、跨语言的远程过程调用。这一技术为桌面应用带来了强大的云端能力扩展价值,使得本地软件能够便捷地集成人工智能、数据分析等前沿服务。在桌面开发领域,Qt/C++框架因其高性能和跨平台特性被广泛应用。通过其内置的QNetworkAccessManager和QJsonDocument模块,开发者可以在不引入额外语言环境的前提下,直接处理H

weixin_30756499的博客 368

〔重庆理工大学〕计算机网络课程设计报告【TCP 客户端-服务器聊天程序】

本文介绍了基于TCP协议的客户端-服务器聊天程序设计与实现。系统采用Python开发,实现了文本通信和文件传输功能,通过多线程架构解决界面卡顿问题。服务器端支持端口监听和客户端连接管理,客户端可连接服务器进行双向通信。文件传输采用分块发送机制,确保大文件传输的可靠性。系统使用PyQt5开发GUI界面,提供直观的操作体验,并处理了多种网络异常情况。经测试验证,系统满足设计要求,具有较好的实用性和扩展性。

Pretty Boy Fox的博客 1330

socket网络程序设计实验三,服务器与多个客户的并发通信(基于python3.7、PyQt5)

目录前言一、实验目的二、实验环境合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 前言 上一篇文章socket网络程序设计实验三中...

LiePy的博客 2159

利用python PyQt5图形库开发的一个基于tcp协议仿QQ聊天pc工具

利用python PyQt5图形库开发的一个基于tcp协议仿QQ聊天pc软件工具 *软件介绍: 运行启动 功能展示 源码详解介绍 *运行启动 由于本软件基于tcp协议开发,首先要运行服务端Tcp_server.py,再运行login.py文件即可看到软件界面(开发工具pycharm)

python socket实现实时通信

基于python socket、pyqt5 实现的界面化实时通信(仿QQ) 前段时间学了socket编程,也跟着几位up主学了简易的聊天程序,觉得能实现有界面的聊天程序,便利用界面化设计编写了此程序。 利用python socket实现不同主机间的通信,通过服务器转发将不同主机间的通信信息传送,达到一对一通信和多主机建共同通信。再利用pyqt5做出界面,将获得的信息在界面中打印实现。 小白学习经历,不喜勿喷。感谢! 文章目录界面实现主页面聊天界面socket 通信服务器端客户端截图展示 界面实现 主页面

LYXDMX的博客 3365

Python-OpenCV及cv2,numpy库最新安装教程[最全步骤]

安装教程目录前言OpenCV-Python安装教程报错解决cv2安装numpy安装opencv安装(附加)总结 前言 首先,我知道一些看到我的Blog的人已经在网上找了很多歪路子,现在已经火冒三丈了(我也是这样过来的hhhh),那么现在,深呼吸,跟着我的教程,不要着急,每一步都要读一遍。完整安装过程需要1个小时左右(仅供参考,本人第一次安装python花了一天(确信)) OpenCV-Python...

qq_45425286的博客 7430

Claude Code 实战指南:用 AI 玩转终端编程,效率狂飙!

本文介绍了终端 AI 代理工具 Claude Code,涵盖常用命令、使用方法(如 init 初始化、权限配置、工作流程、上下文管理)、MCP 扩展工具及实战案例,展示其通过自然语言辅助开发的高效性与实用性。

个人技术 1万+

socket网络程序设计实验二,客户端向服务器端发送并接收反馈消息(基于python3.7、PyQt5)

上一篇文章socket网络程序设计实验一中,我们知道了怎么利用socket获取IP地址,这一篇文章我们来玩一下如何发送消息,老规矩先上图: 编写一个客户端界面程序发送消息给服务器端,服务器端反馈消息给客户端 上一篇讲的比较细,这一篇就不重复了,直接上干货 一、设计界面 打开pycharm -> Tools -> External tools -> Qt Desig...

LiePy的博客 2016

EPICS电机支持(asynMotor)

EPICS电机支持(asynMotor)

yuyuyuliang00的博客 915

Python GUI网络聊天室开发:从Socket到PyQt5实战

网络编程与GUI开发是Python全栈开发的两大核心技术。通过Socket模块实现TCP协议通信,结合多线程处理并发连接,可以构建稳定的客户端-服务器架构。PyQt5凭借其成熟的信号槽机制和丰富的UI组件,成为开发桌面GUI应用的理想选择。本文以网络聊天室项目为例,详细讲解如何使用Python标准库socket处理网络通信,配合PyQt5实现美观的聊天界面,涵盖TCP协议、JSON消息格式、多线程编程等关键技术点。这种技术组合特别适合需要实时交互的应用场景,如即时通讯、远程监控等系统开发。

weixin_34216196的博客 343

EtherCAT应用层协议选型指南:CoE、SoE、EoE、FoE、AoE到底怎么选?看完这篇就懂了

本文深入解析EtherCAT应用层协议(CoE、SoE、EoE、FoE、AoE)的选型策略,从实时性、数据吞吐量和功能完整性三大核心指标出发,提供工业场景下的实战决策框架。通过技术特性对比、混合协议架构设计和常见故障规避指南,帮助工程师优化自动化设备通信性能。

weixin_28718793的博客 489

AI编程助手Cursor如何革新经济学研究:从计量模型到可视化全流程实战

在数据科学和人工智能技术蓬勃发展的今天,如何高效地将前沿AI工具融入专业领域的研究工作流,成为提升科研效率的关键。其核心原理在于通过自然语言交互,将研究者的专业问题转化为机器可执行的指令,从而实现人机协作的范式转移。这一技术的核心价值在于大幅降低非计算机背景研究者的编程门槛,将精力从繁琐的代码实现中解放出来,更聚焦于学科本身的思想与逻辑。尤其在经济学、金融学等高度依赖数据分析和计量建模的领域,AI编程助手能够快速处理数据清洗、模型估计、可视化及结果解释等任务。具体到应用场景,研究者可以利用结构化提示词工程,

weixin_42531579的博客 296

【Python】多人聊天室案例、生成器和迭代器

在 Python 中,生成器(Generators)和迭代器(Iterators)是用于逐个访问元素序列的工具。它们使得你可以编写高效且易于维护的代码来处理大量数据或无限流的数据,而无需一次性将所有数据加载到内存中。下面详细介绍这两种概念及其区别。

专注上位机开发、机器视觉、机器学习、嵌入式软硬件开发 1万+

智慧城市项目实战:如何将你的地理数据从城市坐标系(如上海2000)转换到国家CGCS2000?

本文详细介绍了智慧城市项目中地理数据坐标系转换的全流程解决方案,重点讲解如何将城市坐标系(如上海2000)转换到国家CGCS2000。通过七参数布尔莎模型、ArcGIS Pro、QGIS开源方案及Python编程实现,帮助实施团队解决坐标系不统一的技术难题,确保空间分析精度。

weixin_28725949的博客 304

学Python划重点七 网络编程(使用TCP Socket实现QQ聊天)

前言: 在学校两个月都没有时间更博客,现在放假回家把原来准备好的给补上。 客户端服务器(Client Server, C/S) 结构网络是一种主从结构网络。服务器一般处于等待状态,如果有客户端请求,服务器响应请求,建立连接提供服务。服务器是被动的,客户端是主动的。 一、知识点总结 1. 创建TCP Socket socket 模块提供了一个socket() 函数可以创建多种形式的socket 对象。 语法如下:socket(family, type[,protocol]) # 定义套接字 s s=soc

程序员战胜 1550

binning模式下和normal模式下相同曝光参数相同场景加权亮度差异消除方案优化(一)

摘要:针对ISP参数设置中浮点权重系数需转换为整数的问题,提出整数邻域搜索方案。该方法在浮点最优解附近(±1/±2)进行局部搜索,通过逐阶微调找到误差最小的整数权重组合,避免直接取整导致的误差反弹(误差从0.8%降至0.35%)。方案结合范围约束(1~15)和单调性约束(暗端递减、亮端递增),兼顾计算效率(单图耗时<10ms)与硬件兼容性,显著优于暴力搜索和简单取整,满足工程落地需求。

大熊 96

Rockchip eMMC寿命监控:SMART信息读取与预防性维护

擦写计数坏块数量温度使用时间。

小灰灰的博客 762

基于python的聊天室_Python实现文字聊天室

你是否想过用所学的Python开发一个图形界面的聊天室程序啊?像这样的:如果你想开发这样一个有点怀旧风格的聊天程序,那么可以接着看;要开发这个聊天程序,你需要具备以下知识点:asyncore 、asynchat模块使用wxPython 图形开发这个聊天程序的实验原理如下:由于 Python 是一门带 GIL 的语言,所以在 Python 中使用多线程处理IO操作过多的任务并不是很好的选择。同时聊天...

weixin_39611820的博客 733

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

利用 Python 结合 UI 来模拟实现多人聊天

用python来模拟群聊,类似QQ/微信的通信。

qq_39330735的博客 960

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

小试一下 python写的简单DOS框聊天脚本

import threading import datetime import socket otherip='192.168.3.29' otherport=8003 yourport=8003 class ServerClass(threading.Thread): def run(self): print '1start' if __name__ == '__main__'

ZXL工作室 1569

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

CS期末复习资料怎么做?一份回忆版合集三年维护全攻略

计算机专业课程知识点密集、期末题型差异大,靠临时抱佛脚很难覆盖全部考点。对于操作系统、数据结构、数据库这类核心课,历年考题的题型与重点分布就是最好的复习坐标。但零散的经验分享难以沉淀,需要借助结构化整理与协作机制,将一届届学生的记忆转化为可检索、可统计的资料库。通过Git仓库配合Markdown模板统一收集,用考点频率表量化高频考点,再辅以交叉验证与去重流程,就能把碎片信息变成高价值的学习资源。这种资料库不仅能服务本校学生,也能为跨专业学习者提供课程考核方向的参考。本文结合计算机专业期末备考场景,完整复盘一

weixin_33824363的博客 496

PyQt5应用与实践

一个典型的GUI应用程序可以抽象为:主界面(菜单栏、工具栏、状态栏、内容区域),二级界面(模态、非模态),信息提示(Tooltip),程序图标等组成。本篇根据作者使用PyQt5编写的一个工具,介绍如何使用PyQt5构建一个典型的GUI应用。 1. 主界面 QMainWindow类提供一个有菜单条、锚接窗口(例如工具条)和一个状态条的主应用程序窗口。主窗口通常用在提供一个大的中央窗口部件

惟愿莲心不染尘 3646
上一篇: socket网络程序设计实验二,客户端向服务器端发送并接收反馈消息(基于python3.7、PyQt5)
下一篇: socket网络程序设计实验三,服务器与多个客户的并发通信(基于python3.7、PyQt5)
LiePy
博客等级 码龄7年 1927粉丝 33原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值