今天我们一起来学习服务器端的代码。
程序结构
8个主要函数。
核心代码解析
为节约篇幅一些简单的代码就不解释了。
def initServer(self):
self.tcpPort = 7788
self.tcpServer = QTcpServer(self)
self.clientConnection = QTcpSocket(self)
self.tcpServer.newConnection.connect(self.sendMessage)
self.serverStatuslabel.setText("请选择要传送的文件")
self.progressBar.reset()
self.serverOpenBtn.setEnabled(True)
self.serverSendBtn.setEnabled(False)
self.tcpServer.close()
新增的两个类:QTcpServer、QTcpSocket我们先来了解一下。QTcpServer类提供基于TCP的服务器。
此类可以接受传入的TCP连接。您可以指定端口或让QTcpServer自动选择一个。您可以收听特定地址或所有机器地址。
调用listen()让服务器侦听传入的连接。每次客户端连接到服务器时,都会发出newConnection()信号。
调用nextPendingConnection()以接受挂起的连接作为已连接的QTcpSocket。该函数返回一个指向QAbstractSocket.ConnectedState中QTcpSocket的指针,您可以使用该指针与客户端进行通信。
如果发生错误,serverError()将返回错误类型,并且可以调用errorString()以获取对所发生情况的可读描述。
监听连接时,服务器正在侦听的地址和端口可用作serverAddress()和serverPort()。
调用close()会使QTcpServer停止侦听传入连接。
尽管QTcpServer主要设计用于事件循环,但可以在没有事件循环的情况下使用它。在这种情况下,您必须使用waitForNewConnection(),它会阻塞,直到连接可用或超时到期。
详见:QTcpServer Classdoc.qt.ioQTcpSocket类提供TCP套接字。
TCP(传输控制协议)是一种可靠的,面向流的,面向连接的传输协议。 它特别适用于连续传输数据。
QTcpSocket是QAbstractSocket的子类,允许您建立TCP连接并传输数据流。
详见:QTcpSocket Classdoc.qt.io
self.tcpPort = 7788
self.tcpServer = QTcpServer(self)
self.clientConnection = QTcpSocket(self)
self.tcpServer.newConnection.connect(self.sendMessage)QTcpSocket Classself.tcpPort = 7788
self.tcpServer = QTcpServer(self)
self.clientConnection = QTcpSocket(self)
self.tcpServer.newConnection.connect(self.sendMessage)
这里我指定了TCP端口为7788,你可以随意改,只要不冲突就行了。
self.tcpServer = QTcpServer(self)
self.clientConnection = QTcpSocket(self)
self.tcpServer.newConnection.connect(self.sendMessage)
我们创建一个Tcp服务器和一个Tcp套接字。当有新的连接来的时候发出newConnection信号,我们连接到sendMessage()函数。
self.serverStatuslabel.setText("请选择要传送的文件")
self.progressBar.reset()
self.serverOpenBtn.setEnabled(True)
self.serverSendBtn.setEnabled(False)
self.tcpServer.close()
显示我们开始创建的对话框,打开按钮是可用的,发送按钮是不可用的,进度条复位,先关闭服务器。
def sendMessage(self):
self.serverSendBtn.set