TCP/IP-Client und Server etablieren den Kommunikationsprozess

Der Kommunikationsprozess zwischen Client und Server wird hergestellt

Fügen Sie hier eine Bildbeschreibung ein

Die Verwendung der von Qt bereitgestellten Klassen für TCPdie Socket-basierte Kommunikation erfordert die Verwendung von zwei Klassen:

QTcpServer:服务器类,用于监听客户端连接以及和客户端建立连接。
QTcpSocket:通信的套接字类,客户端、服务器端都需要使用。

Service-TerminalQTcpServer

QTcpServerDiese 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 QHostAddressgekapselt IPv4und formatiert werden kann, was eine automatische Bindung anzeigt.IPv6QHostAddress::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 ist false.

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

QTcpSocketEs 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:




Fügen Sie hier eine Bildbeschreibung ein

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 QTcpServerein Unterobjekt. Wenn QTcpServerdas 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:

  1. msec: Geben Sie die maximale Blockierungsdauer in Millisekunden an ( ms);
  2. timeout: Ausgehender Parameter. Wenn bei der Operation eine Zeitüberschreitung timeoutauftritt true, gibt es keine timeoutZeitüberschreitung false.

Signale während der Socket-Kommunikation

QTcpSocket1. 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();

Fügen Sie hier eine Bildbeschreibung ein

Fügen Sie hier eine Bildbeschreibung ein

Fügen Sie hier eine Bildbeschreibung ein

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

Guess you like

Origin blog.csdn.net/weixin_40933653/article/details/133017594