Der Kommunikationsprozess zwischen Client und Server wird hergestellt
Die Verwendung der von Qt bereitgestellten Klassen für TCP
die Socket-basierte Kommunikation erfordert die Verwendung von zwei Klassen:
QTcpServer:服务器类,用于监听客户端连接以及和客户端建立连接。
QTcpSocket:通信的套接字类,客户端、服务器端都需要使用。
Service-TerminalQTcpServer
QTcpServer
Diese Klasse wird verwendet, um Client-Verbindungen zu überwachen und Verbindungen mit Clients herzustellen. Bevor wir sie verwenden, stellen wir einige allgemeine API-Funktionen vor, die von dieser Klasse bereitgestellt werden:
öffentliche Mitgliedsfunktion
Konstrukteur
QTcpServer::QTcpServer(QObject *parent = nullptr)
listen()
Stellen Sie die Mithörfunktion für die Mithörbuchse ein
bool QTcpServer::listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0);
通过启动监听按钮
Richten Sie die Überwachung im Code ein
//启动监听服务
void MainWindow::on_setListen_released()
{
unsigned short port =ui->port->text().toUShort();
m_server->listen(QHostAddress::Any,port);
ui->setListen->setDisabled(true);//
}
Parameter:
- Adresse : Eine IP-Adresse, die über eine Klasse
QHostAddress
gekapseltIPv4
und formatiert werden kann, was eine automatische Bindung anzeigt.IPv6
QHostAddress::Any
- Port : Wenn als 0 angegeben, bedeutet dies, dass ein verfügbarer Port zufällig gebunden wird. Rückgabewert: Wird zurückgegeben, wenn die Bindung erfolgreich war
true
, und wird zurückgegeben, wenn die Bindung fehlgeschlagen istfalse
.
Bestimmt, ob das aktuelle Objekt überwacht wird, gibt „true“ zurück, wenn es nicht überwacht wird, und gibt „false“ zurück
bool QTcpServer::isListening() const;
Wenn das aktuelle Objekt lauscht, geben Sie die Adressinformationen des lauschenden Servers zurück , andernfalls kehren Sie zurückQHostAddress::Null
QHostAddress QTcpServer::serverAddress() const;
Wenn der Server auf Verbindungen lauscht, wird der Port des Servers zurückgegeben; andernfalls wird 0 zurückgegeben
quint16 QTcpServer::serverPort() const
Service-TerminalQTcpSocket
QTcpSocket
Es handelt sich um eine Socket-Kommunikationsklasse, die sowohl vom Client als auch vom Server verwendet werden muss. Das Senden und Empfangen von Daten stellt ebenfalls eine E/A-Operation (Netzwerk-E/A) dar Qt
. Schauen wir uns zunächst die Vererbungsbeziehung dieser Klasse an:
Rufen Sie das für die Kommunikation verwendete Socket-Objekt ab, nachdem Sie eine Verbindung mit dem Client hergestellt haben QTcpSocket
. Es handelt sich um QTcpServer
ein Unterobjekt. Wenn QTcpServer
das Objekt zerstört wird, wird dieses Unterobjekt automatisch zerstört. Natürlich können Sie es auch manuell zerstören. Dies wird empfohlen um es nach Gebrauch selbst zu tun. Zerstören Sie dieses Kommunikationsobjekt manuell QTcpSocket
.
QTcpSocket *QTcpServer::nextPendingConnection();
Das Blockieren und Warten auf eine vom Client initiierte Verbindungsanforderung wird für die Verwendung in Single-Thread-Programmen nicht empfohlen waitForNewConnection()
. Es wird empfohlen, für die Verarbeitung neuer Verbindungen eine nicht blockierende Methode zu verwenden, d. h. Signale zu verwenden newConnection()
.
bool QTcpServer::waitForNewConnection(int msec = 0, bool *timedOut = Q_NULLPTR);
Parameter:
msec
: Geben Sie die maximale Blockierungsdauer in Millisekunden an (ms
);timeout
: Ausgehender Parameter. Wenn bei der Operation eine Zeitüberschreitungtimeout
auftritttrue
, gibt es keinetimeout
Zeitüberschreitungfalse
.
Signale während der Socket-Kommunikation
QTcpSocket
1. Wenn dieser Objekttyp während der Verwendung der Socket-Kommunikation readyRead()
ein Signal aussendet, bedeutet dies, dass die vom Peer gesendeten Daten erreicht wurden, und dann readAll ()
kann die Funktion aufgerufen werden, um die Daten zu empfangen.
[signal] void QIODevice::readyRead();
offizielle Erklärung
This signal is emitted once every time new data is available for reading from the device's current read channel. It will only be emitted again once new data is available, such as when a new payload of network data has arrived on your network socket, or when a new block of data has been appended to your device
2. connectToHost()
Senden Sie ein Signal, nachdem Sie die Funktion aufgerufen und die Verbindung erfolgreich hergestellt haben connected()
.
[signal] void QAbstractSocket::connected();
3. Das Signal „disconnected()“ wird ausgegeben, wenn der Socket getrennt wird.
[signal] void QAbstractSocket::disconnected();
Empfange Daten
// 指定可接收的最大字节数 maxSize 的数据到指针 data 指向的内存中
qint64 QIODevice::read(char *data, qint64 maxSize);
// 指定可接收的最大字节数 maxSize,返回接收的字符串
QByteArray QIODevice::read(qint64 maxSize);
// 将当前可用操作数据全部读出,通过返回值返回读出的字符串
QByteArray QIODevice::readAll();
Daten senden
// 发送指针 data 指向的内存中的 maxSize 个字节的数据
qint64 QIODevice::write(const char *data, qint64 maxSize);
// 发送指针 data 指向的内存中的数据,字符串以 \0 作为结束标记
qint64 QIODevice::write(const char *data);
// 发送参数指定的字符串
qint64 QIODevice::write(const QByteArray &byteArray);