首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

PyQt5:局域网群聊小工具Plus 3

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

最后

好的,今天介绍就到这里了,下期我们再见!如果你喜欢本篇文章,请给我点赞

赞赏(推荐)

分享给你的好友们吧!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181002G1A3IB00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券