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

python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器 本文在上文的基础上重新实现支持多线程的服务器。 阅读详情

前言

上一篇文章socket网络程序设计实验三中,我们用socket实现了客户与服务器一对一聊天的功能,也就是客户与服务器之间的一对一通信,这次我们来尝试一下服务器与多个客户的并发通信,实现一个类似聊天室的小程序。这一篇也会讲的详细一些,把能想到的功能尽量完善,把能想到的bug都解决掉。总之这是一篇比较干的,干货。

老规矩先放图!
在这里插入图片描述

一、实验目的

  1. 掌握 socket编程 的基本模式,了解客户端与服务器端的主要工作;
  2. 进一步巩固 PyQt5 的设计和使用,完善一些友好的交互式小细节;
  3. 练习多线程编程的用法,明白什么时候需要用到多线程。

二、实验环境

不同环境配置的实现其实也大同小异,以下是我的实验环境:

  • Windows10_64
  • pycharm(安装了Qt Designer和Py UIC工具)
  • python3.7.1
  • PyQt5

三、实验内容

(一)设计界面

打开pycharm,通过顶部的Tools -> External tools -> Qt Designer,打开Qt Designer,(没有安装Qt Designer的百度自行安装一下)

ps:为什么要用Qt Designer?
因为用它设计界面直观可见,可以很方便的调整控件的大小位置以及属性等,搭配Py UIC工具自动生成代码,十分方便。

Ok,打开之后是这样的:
1
我们选择第三个Dialog Without Button就好,然后点Create创建我们的主窗口

现在开始设计我们的界面,要设计服务器端和客户端两个界面,我的是这么摆的:
服务器端界面:
2
客户端界面:
3
简单明了呀
这里会发现有的按钮和输入框是灰色的,也就是禁用状态,选择这个控件,在右边的属性里找到一个enabled选项,把勾去掉就是灰色的了,也可以生成代码了之后在代码中改,待会儿会讲的。

完了之后保存就好,保存的话养成改名的好习惯,服务器的就叫server_5.ui,客户端的就叫client_5.ui。

(二)生成代码

在pycharm左边project中找到我们刚才保存的server_5.ui和client_5.ui文件,右键一下,还是External Tools -> Py UIC,我们会发现同目录下已经自动生成了我们最爱的.py文件了,名字都是一样的

Ok,打开它们,补充代码
在开头加上需要导入的库:

import sys
from PyQt5 import QtCore, QtWidgets
from PyQt5.Qt import *

在最后加上main:

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

至此,程序就可以运行了

但是目前还没有任何功能,我们运行的只是个空的界面而已,要实现我们想要的功能还需要添加一些代码。

(三)主要功能实现

服务器端

有了上一篇文章的经验,这里其实很easy了,主要的区别就是这次我们要同时处理多个客户端的连接请求,所以涉及到多线程,每当收到连接请求时,都要新建一个进程,来持续服务

话不多说,一步一步来,先用init初始化方法加一些我们要用的变量:

    def __init__(self):
        self.t2 = []    # 用来存放线程的列表
        self.s = socket.socket()    # 服务器socket
        self.c = []     # 客户端socket列表
        self.count = 0  # 用来计数正在连接的客户
        self.msg = ''   # 需要显示的消息
        self.flag = False   # 服务器的开启状态

然后定义我们的监听按钮的方法:

    def listen_button(self):        # 监听按钮
        add1 = '127.0.0.1'
        add2 = self.lineEdit.text()
        self.s = socket.socket()
        self.s.bind((add1, int(add2)))
        self.s.listen()
        print('正在监听。。。')
        self.msg = '服务器开始运行~\n' + '*'*53 + '\n'
        self.textBrowser.setText(self.msg)
        t1 = threading.Thread(target=self.accept_socket)
        t1.start()		# 启动线程
        self.pushButton.setEnabled(False)       # 点击监听按钮后该按钮将不可点击
        self.pushButton_2.setEnabled(True)	# 断开按钮设为可用
        self.flag = True	# 服务器开启

这里self.pushButton.setEnabled(False) 再点击“监听”按钮后直接设置“监听”按钮不能被点击,就不会出现重复点击的异常了,同理“断开”按钮也是:

        def break_button(self):     # 断开按钮
        if self.count > 0:
            for cc in self.c:
                if cc != 0:     # 因为后面断开的客户端socket将它置为0了
                    cc.send('{}服务器已断开!\n'.format(time.ctime()).encode('GB2312'))
                    cc.close()
            self.c.clear()
        self.s.close()
        self.pushButton.setEnabled(True)        # 点击断开按钮后,监听按钮可用
        self.pushButton_2.setEnabled(False)
        self.flag = False

定义监听按钮listen_button()中用到的接收连接accept_socket()方法:

    def accept_socket(self):     # 接收socket连接
        try:
            while 1:
                print('等待连接中。。。')
                c_, addr = self.s.accept()
                self.c.append(c_)	# 将c_即客户端socket存入列表
                self.count += 1		# 计数+1
                print(addr, '已连接')
                t2_ = threading.Thread(target=self.rec_msg, args=(len(self.c)-1,))
                self.t2.append(t2_)
                t2_.start()		# 启动线程
        except:
            pass

定义接收消息方法:

    def rec_msg(self, i):      # 接受信息
        try:
            while 1:
                print('等待接受消息中。。。')
                msg = self.c[i].recv(1024).decode('GB2312')
                print('收到消息', msg)
                if '进入聊天室~' in msg:       # 服务器端不会显示客户聊天的内容,只显示进入的用户
                    self.msg += msg
                for step, x in enumerate(self.c):      # 当收到客户消息时,转发给其他所有在线客户
                    if step != i:
                        x.send(msg.encode('GB2312'))
                if '退出聊天室' in msg:
                    self.msg += msg
                    self.count -= 1
                    self.c[i] = 0
                    # self.t2[i]._stop()    # 线程不能强制退出,所以下面用break正常结束
                    print('结束', len(self.t2))
                    break
                if self.flag is False:
                    break	# 如果服务器停止,则退出循环
        except ConnectionAbortedError as e1:
            print(e1)

注意这里的方法要和客户端联系起来,这里我预想的是客户端连接后会发送一条“xxx进入聊天室”的消息给服务器,断开连接前会发送一条"xxx退出聊天室"的消息给服务器,所以这样。

再把按钮和我们定义的方法关联起来,在retranslateUi()的后面加上:

		self.pushButton.clicked.connect(self.listen_button)
        self.pushButton_2.clicked.connect(self.break_button)
        self.pushButton_2.setEnabled(False)    # 初始化未监听时断开按钮不可点击

还有上一篇中一样的,实时刷新需要用到的,在类内定义一个显示信息的方法:

    def handleDisplay(self):      # 显示收到的信息
        self.textBrowser.setText(self.msg)
        self.label_2.setText('在线人数:{}'.format(self.count))
        self.textBrowser.moveCursor(self.textBrowser.textCursor().End)  # 文本框拉到底部

在类外新建一个自定义类:

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()

Ok,服务器端就完成了

客户端

大多数事情都交给服务器端处理了,客户端要处理的事情就没有那么复杂,只需要请求连接,接受和发送消息并实时显示出来就好了

先来定义连接按钮的方法:

    def connect_button(self):  # 连接按钮
        try:
            name = self.lineEdit.text()
            add1 = self.lineEdit_2.text()
            add2 = self.lineEdit_3.text()
            self.s = socket.socket()
            self.s.connect((add1, int(add2)))
            print('已连接到服务器')
            self.msg += '连接成功~\n您已进入聊天室\n'+'*'*74+'\n'
            self.textBrowser.setText(self.msg)
            self.s.send('[{}]{}进入聊天室~\n'.format(time.ctime(), name).encode('GB2312'))
            t = threading.Thread(target=self.rec_msg)
            t.start()
            self.pushButton.setEnabled(True)    # 连接后可以断开
            self.pushButton_2.setEnabled(False) # 连接后不可以再连接
            self.pushButton_3.setEnabled(True)  # 连接后才能发送
            self.lineEdit.setEnabled(False)     # 连接后不可以修改用户名
        except:
            self.msg += '服务器未开放!\n'
            print('服务器未开放!')

这里添加了异常处理,如果服务器没有开放,会提示服务器未开放,防止闪退。

这里创建的线程还用到了rec_msg()方法用来接收消息:

    def rec_msg(self):  # 接受消息
        try:
            while 1:
                print('等待接受消息中。。。')
                msg = self.s.recv(1024).decode('GB2312')
                print('收到消息', msg)
                self.msg += msg
                print(self.msg)
        except ConnectionAbortedError as e1:
            print(e1)
        except ConnectionResetError as e2:	# 这里是捕获服务器端强行断开异常
            print(e2)
            self.pushButton.setEnabled(False)
            self.pushButton_2.setEnabled(True)
            self.pushButton_3.setEnabled(False)

再定义断开按钮:

    def break_button(self):  # 断开按钮
        name = self.lineEdit.text()
        self.s.send('[{}]{}退出聊天室\n'.format(time.ctime(), name).encode('GB2312'))
        self.s.close()
        print('已关闭服务器')
        self.msg += '您已退出登录\n'
        self.pushButton.setEnabled(False)   # 断开后不能再断开
        self.pushButton_2.setEnabled(True)  # 断开后可以连接
        self.pushButton_3.setEnabled(False) # 断开后不能发送
        self.lineEdit.setEnabled(True)      # 断开后可以修改用户名

断开前发送消息给服务器端,以便进行服务器端的处理工作

定义发送按钮:

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

还有实时显示的部分,定义显示收到的信息:

    def handleDisplay(self, data):  # 显示收到的消息
        self.textBrowser.setText(self.msg)
        self.textBrowser.moveCursor(self.textBrowser.textCursor().End)  # 文本框显示到底部

导入server代码中的自定义的类:

from test5.server_5 import BackendThread

再在retranslateUi方法下加入:

		self.pushButton.clicked.connect(self.break_button)
        self.pushButton_2.clicked.connect(self.connect_button)
        self.pushButton_3.clicked.connect(self.send_button)
        self.pushButton.setEnabled(False)
        self.pushButton_3.setEnabled(False)

        # 调用自定义类,同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()

至此,客户端也大功告成了!
然后我们可以直接copy,parse一下,搞出好几个客户端来,在retranslateUi下改一下名字:

	self.lineEdit.setText(_translate("Dialog", "Mike"))
self.lineEdit.setText(_translate("Dialog", "LiePy"))
self.lineEdit.setText(_translate("Dialog", "Eric"))

…
一个人扮演N个人开始吹。。,不,调试一下看看还有没有什么bug或者异常之类的没有考虑到的
在这里插入图片描述
嗯,暂时我是没有发现新的bug了,至于功能方面,其实还有很多地方可以完善,比如聊天记录的保存啊、读取啊,消息界面的清空啊、发送图片啊、视频啊,发送文件之类的,有想一起学习的就评论我,私聊我呀,人生苦短,我们一起学python

Ok,这篇文章就到这里吧

pass~

ps:源代码已上传至我的github:https://github.com/LiePy/socket_test.git

PyQt5 - 05 逻辑与界面分离使用pyqt5+socket实现TCP/UDP通信 运用逻辑与界面分离的思想,使用pyqt5+socket模块编写图形化TCP/UDP/WEB通信工具。 实现效果如图: 强制关闭线程的脚本stopThreading.py: import ctypes import inspect def _async_raise(tid, exc_type): tid = ctypes.c_long(tid) if... 阅读详情

相关推荐

PyQt5 使用QtNetwork实现基于UDP的网络广播程序

参考链接 【PyQt4 实例19】基于UDP的网络广播程序_陈晓明start的博客-优快云博客 前言 本文转为PyQt5代码,无其他改动。有问题请讨论,虚心请教。 截图 代码 qt5udpclient.py # -*- coding: utf-8 -*- import sys from PyQt5.QtWidgets import QWidget, QVBoxLayout, QTextEdit, QPushButton, QMessageBox, QApplicati..

wem2017的博客 4249

python向后台写入信息

#pyqt4 #!/usr/bin/python #coding:utf-8 import sys from PyQt4 import QtCore, QtGui reload(sys) sys.setdefaultencoding("utf-8") class W2(QtGui.QDialog): myclicked = QtCore.pyqtSignal(str) ...

桜 921

C 语言网络编程 — 高并发 TCP 网络服务器

可见,I/O 多路复用模型大大增加了每个进程可以管理的 Socket 数量,直到操作系统 fd 最大数量限制为止,通常可以设置百万级别,即:单机单进程支持百万连接,epoll 是解决 C10K 的利器,很多开源软件用到了它。四次挥手是一个冗长的过程,由于网络环境的复杂性与 TCP 连接的可靠性相违背,所以在某些特殊的场景中会出现相应的问题。所以,实际上,close() 并不会马上断开 Socket Connection,在高性能网络服务器中,需要非常关注 TCP 连接的状态情况。

烟云的计算 1679

python socket实现实时通信

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

LYXDMX的博客 3365

PyQt5使用Socket进行通讯(教程)

我们先来学会如何在python中使用Socket,然后我们只需要给它加上一个可视化界面就变成了一个完整的程序,在这其中难点是如何使用Socket,可视化界面其实并不是什么难点!我会在本期文章中向大家详解Socket使用方法!Socket编程是一种在计算机网络中进行通信的基本方法,它允许在网络中的不同设备之间传输数据。在Python中,socket模块提供了对基本套接字操作的支持,允许你创建客户端和服务器应用程序。

weixin_60962920的博客 3455

倒立摆入门详解+pid调参

倒立摆制作全过程 最近在练习pid的控制算法,就选用了2013年的电子设计国赛题目:倒立摆 。 首先给你们看看我的成果 注意哦:倒立摆不是靠上面黄色的传感器保持平衡的,而是通过下面的电机左右扭动使得摆杆不掉下来,难度可不小了。 材料准备 1.机械部分 如图所示选好电机和角位移传感器进行组装就好了,这个部分是我直接网上购买的,如果要自己装也是可以的,不过会比较麻烦,结构差不多的。 2.主控部分 这个部分的话完全是我自己设计的,作用和网上买的一样,因为网上买的话太贵了,有需要的话可以联系我,有pcb文件

small_po_kid的博客 2万+

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

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

LiePy的博客 2695

pcle接口详解&用途说明

它原来的名称为“3GIO”,由英特尔在2001年提出。pcel x16插槽 用途用于显卡、RAID阵列卡,向下兼容PCIE x1/x4/x8/x16。(PCIE x16插槽长89mm,有164根针脚,靠主板外侧端有一卡口,将16x分为前后两组,短插槽有22根针脚,主要用于供电,长插槽142根,主要用于数据传输,具有16通道所带来的高带宽)PCI-E x8插槽插槽用途:全长56mm,有98根针脚,与PCI-E x16比较,主要是数据针脚减少至76根,短的供电针脚仍然是22针脚。

qq_43289307的博客 1万+

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

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

LiePy的博客 2016

告别纸上谈兵:在Xilinx Artix-7 FPGA上实测RGMII接口,从ILA抓包到PC Ping通全流程记录

本文详细记录了在Xilinx Artix-7 FPGA平台上实现RGMII接口的全过程,包括硬件配置、Vivado工程设置、双沿数据转换代码实现以及ILA波形分析。通过实测数据包捕获和PC端Ping测试,验证了千兆以太网通信的稳定性和可靠性,为工业通信网关等应用提供了实用参考。

weixin_33701251的博客 287

RK3588上从零部署Facenet人脸识别:PyTorch转ONNX再到RKNN的完整避坑指南

本文提供了在RK3588开发板上从零部署Facenet人脸识别模型的完整指南。详细介绍了从PyTorch模型导出、转换为ONNX格式,再通过RKNN-Toolkit2转换为RKNN格式的完整流程,并重点分享了环境配置、算子兼容性处理、量化调优及板端部署中的关键步骤与避坑经验。

river的博客 463

tcp通信、socket、threading多线程、PyQt5界面

文章目录前言一、总讲二、socket1.设置服务端2.设置客户端3.难点总结 前言 由于课程的需要,笔者花费了近一个星期的时间终于学了一点关于tcp通信、socket、threading多线程、PyQt5界面的知识,菜鸟表示:“我终于升级了” 提示:博客中参考了几位博主的文章,随文附原网址 一、总讲 讲解的思路如下,其中的视频就没有了,取而代之的是其中之一的运行效果图 二、socket 1.设置服务端 提示:这下面的代码已经涉及到PyQt5界面设计了 import sys from PyQt5.Qt

Flylion_truth的博客 2652

控制障碍函数(Control Barrier Function,CBF) 二、示例

使用一个经典简单的示例讲解CBF的推导

Lyajpunov的博客 6429

python3GUI--socket+PyQt5开发局域网微信(含功能、详细介绍、分享)

这篇博客介绍了一个基于PyQt5开发的微信风格聊天软件项目。项目采用混合开发模式,实现了登录注册、消息发送、语音聊天、好友管理等核心功能,并设计了13个个性化页面以高度还原微信UI。技术层面结合了TCP/UDP协议处理消息传输,使用Socket实现服务端与客户端的通信,并通过定长包头解决TCP粘包问题。服务端提供用户管理、数据监控及公告推送功能,客户端支持文本、表情、图片等多种消息形式,以及个性化气泡和背景设置。项目还包含公众号推荐模块,并采用加密存储保障用户数据安全,整体实现了仿微信的交互体验。

懷淰メ的博客 1905

7段数码管驱动电路设计

7段数码管驱动电路设计

好好学习,天天向上 9750

华为OD机试真题 新系统2026-04-15 Python&JS 实现【失灵的键盘】

有一个键盘有2个按键失灵了,按下这些键时会连续输出其他键对应的字符两次。具体如下: 1. 按下j键一次,屏幕上显示uu(两个连续的u);  按下b键一次,屏幕上显示t(两个连续的t) 2. u键和t键是好的,按下u键一次时,屏幕只会显示一次u(正常按键);按下t键一次时,屏幕只会显示一次t(正常按键) 3. 假定屏幕上连续显示两个t一定是按了一次b键,而不是两次t键;假定按键t之后不会紧接着按键b,即tttt转义为两个b,而不可能是tb

MISAYAONE的博客 522

用python的socket、pyqt创建网络对话框

在计算机网络编程中,UDP(User Datagram Protocol,用户数据报协议)是一种无连接、不可靠的传输协议,与TCP(Transmission Control Protocol,传输控制协议)相比,它不需要建立连接、维护连接状态,因此具有较低的开销和延迟,但可能会丢失数据包或数据顺序错乱。这样就可以区分开接收到的和发送的消息了。创建一个tcp客户端的实例化对象,其中AF_INET代表使用标准的IPv4地址或者主机名,SOCK_STREAM代表这个连接是用TCP协议传输的。

2302_80091643的博客 938

Golang内存管理:GC调优实战案例

在Golang编程中,内存管理是一个非常重要的方面。良好的内存管理可以提高程序的性能和稳定性,而GC(垃圾回收)调优则是优化内存管理的关键手段。本文的目的就是通过实际案例,深入讲解Golang中GC调优的方法和技巧,让读者能够在实际项目中更好地进行内存管理和性能优化。范围涵盖了从核心概念的解释到具体代码实现和调优过程的详细分析。本文首先会介绍一些相关的术语和核心概念,让读者对Golang内存管理和GC有一个基本的认识。然后通过故事引入的方式,更加形象地解释核心概念及其相互关系。

AI Agent Harness Engineering 1118

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

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

weixin_34216196的博客 343

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Python聊天室项目——基于PyQt5+Socket+Thread

Python聊天室项目——基于PyQt5+Socket+Thread 去发现同类优质开源项目:https://gitcode.com/ 本项目是一个基于PyQt5图形界面库,结合Socket网络编程以及多线程技术开发的聊天室程序。此项目旨在提供一个有趣且实用的案例,帮助学习和掌握Python中的Socket编程和多线程处理技术。 项目简介 本项目利用PyQt5构建用户界面,通过Socket实现网络...

gitblog_06785的博客 943

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Python 实现聊天室Pyqt5 socket thread

在Pycharm中先运行服务器,在运行客户端,即可使用。

qq_28296199的博客 991

python学习实践(3):PyQt5开发TCP客户端

本文介绍了一个基于Python和PyQt5实现的TCP客户端程序。该客户端采用多线程处理网络通信,能够连接服务器、发送和接收消息,并具备基本的错误处理能力。

m0_71397608的博客 481

基于pyside2(pyqt5)和socket实现的通信界面程序

本次项目python版本环境: python3.10.9所需要的库: PySide2、netifaces、socket、threading、time1.命令行输入(下载慢的话可使用国内镜像源下载,之前的文章我讲过)2.Windows打开——》——》——》前面的勾选上几个就好了。

qq_64192931的博客 1560

项目Demo —— socket下载器

这里介绍一下我计算机网络课的课程设计 实现了一个基于socket的文件传输器,可以配置为服务器或客户端,支持多用户用时下载多个文件。但没有实现单个文件多线程下载 文章目录一、 实验任务和目的二、开发运行环境三、主要功能分析及界面设计1. 功能分析2. 界面设计(1)设计思路(2)主窗口1. UI设计2. 说明:(3)连接配置窗口1. UI设计2. 说明3. 部分关键代码截选(4)文件选择窗口1. UI设计2. 说明3. UI实现思路4. 部分关键代码截选(5)文件传输进度窗口1. UI设计2. 说明四.

佚失的诗篇 2541

python服务器qt客户端_python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例...

本文在上文的基础上重新实现支持多线程的服务器。以下为TCP客户端的程序代码:#!/usr/bin/env python3import sysfrom PyQt5.QtCore import (QByteArray, QDataStream, QDate, QIODevice,QRegExp, Qt)from PyQt5.QtWidgets import (QApplication, QDateEd...

weixin_39914049的博客 178

python写服务器端qt客户端_使用Python语言通过PyQt5和socket实现UDP服务器

前言最近做了一个小软件,记录一下相关内容。已有条件现在已有一个硬件设备作为客户端(暂称其为“电路”)。基于SIM卡,电路可以通过UDP协议传输数据(程序已经内置在电路中),只需要修改配置文件(位于SD卡中,主要修改服务器端的IP和端口)即可。需求我面向的需求是这样的:我需要开发一个服务器端的程序,接收多个客户端发来的数据并开发可视化界面。总结从开发角度和技术角度来看,软件的基础和核心技术是使用UD...

weixin_39799646的博客 1223
上一篇: socket网络程序设计实验三,客户端与服务器端一对一聊天(基于python3.7、PyQt5)
下一篇: FTP编程实验——实现文件上传下载(基于Python3.7和PyQt5)
LiePy
博客等级 码龄7年 1927粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值