PyQt5
72篇
PyQt5:局域网群聊小工具plus 3
导读:加强版
LEARN MORE
正文
今天我们一起来学习服务器端的代码。
1
程序结构
8个主要函数。
2
核心代码解析
为节约篇幅一些简单的代码就不解释了。
新增的两个类:QTcpServer、QTcpSocket我们先来了解一下。
QTcpServer类提供基于TCP的服务器。
此类可以接受传入的TCP连接。您可以指定端口或让QTcpServer自动选择一个。您可以收听特定地址或所有机器地址。
调用listen()让服务器侦听传入的连接。每次客户端连接到服务器时,都会发出newConnection()信号。
调用nextPendingConnection()以接受挂起的连接作为已连接的QTcpSocket。该函数返回一个指向QAbstractSocket.ConnectedState中QTcpSocket的指针,您可以使用该指针与客户端进行通信。
如果发生错误,serverError()将返回错误类型,并且可以调用errorString()以获取对所发生情况的可读描述。
监听连接时,服务器正在侦听的地址和端口可用作serverAddress()和serverPort()。
调用close()会使QTcpServer停止侦听传入连接。
尽管QTcpServer主要设计用于事件循环,但可以在没有事件循环的情况下使用它。在这种情况下,您必须使用waitForNewConnection(),它会阻塞,直到连接可用或超时到期。
QTcpSocket类提供TCP套接字。
TCP(传输控制协议)是一种可靠的,面向流的,面向连接的传输协议。 它特别适用于连续传输数据。
QTcpSocket是QAbstractSocket的子类,允许您建立TCP连接并传输数据流。
这里我指定了TCP端口为7788,你可以随意改,只要不冲突就行了。
我们创建一个Tcp服务器和一个Tcp套接字。当有新的连接来的时候发出newConnection信号,我们连接到sendMessage()函数。
显示我们开始创建的对话框,打开按钮是可用的,发送按钮是不可用的,进度条复位,先关闭服务器。
开始传送文件。
发送按钮不可用。
self.clientConnection作为连接的QTcpSocket对象返回下一个挂起的连接。
同时当连接中每次将数据有效载荷写入设备的当前写通道时,都会发出此信号。在此有效负载中写入的数据量为字节数。
尝试打开文件,要是存在问题就报错。
准备开始传输了。
记录一下需要传输的文件大小。
这里的self.outBlock是QByteArray()的对象,即字节数组。
sendOut是我们新建的一个编码信息二进制流,100%独立于主计算机的操作系统,CPU或字节顺序。 例如,运行Solaris的Sun SPARC可以读取由Windows下的PC写入的数据流。
您还可以使用数据流来读取/写入原始未编码的二进制数据。 数据流与QIODevice密切合作。 QIODevice表示可以从中读取数据和向其写入数据的输入/输出介质。
这里我们指定QIODevice的模式为WriteOnly。
设定QDataStream的版本为Qt_5_4,这么设定是为了避免不兼容的情况,因为不同版本Qt还是有差异性的。
开始计时,这里的self.time是QTime的对象。
传输的文件名。
PyQt5中QDataStream写得方法与Qt上不同,这就造成了很多代码不可能直接拿来改改就用。
这里我们在sendOut中写入文件名以及文件名和文件的大小,大小都是以字节为单位的。
QIODevice读写位置移动到0。然后分别写入总的大小和文件名大小。
待传输文件的大小。
outBlock清零。
这个函数是tcpServer开始写得时候调用的。
这个是我们进行像复制这种长时间操作的时候可以写上这句,以免窗口假死。
当我们待写入的字节数大于0时,我们每次读取的数据都是小于等于self.payloadSize的,这个self.payloadSize我们定义是64KB,即64*1024个字节。
self.bytesToWrite每次减少连接写的数据量大小。
要是待写入的字节数小于等于0,则关闭文件。
上面这段代码看似复杂,其实比较好理解,就是文件传输进度的描述。
这里useTime就是传输用了多长时间,left就是表示剩余时间,speed表示传输速度。
MB这种就表示保留2位小数的浮点数。
进度条显示的方式,以及当传输的字节数等于总的字节数的时候,按钮就显示关闭。
打开文件按钮准备发送。
点击发送按钮,等待接收。
关闭传输对话框,相关数据、连接进行复位,为下次传输进行准备。
对方拒绝时,主程序会调用服务器的refused()函数,关闭服务器。
产生关闭事件,直接调用关闭窗口按钮函数。
3
最后
好的,今天介绍就到这里了,下期我们再见!如果你喜欢本篇文章,请给我点赞
赞赏(推荐)
分享给你的好友们吧!
领取专属 10元无门槛券
私享最新 技术干货