TCP/IPクライアントとサーバーは通信プロセスを確立します

クライアントとサーバー間の通信プロセスが確立される

ここに画像の説明を挿入します

TCPソケットベースの通信用に Qt が提供するクラスを使用するには、次の 2 つのクラスが必要です。

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

サービスターミナルQTcpServer

QTcpServerこのクラスは、クライアント接続を監視し、クライアントとの接続を確立するために使用されます。使用する前に、このクラスが提供するいくつかの一般的な API 関数を紹介します。

パブリックメンバー関数

コンストラクタ

QTcpServer::QTcpServer(QObject *parent = nullptr)

リスニングソケットのリスニングlisten()機能を設定する

bool QTcpServer::listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0);

コードで通过启动监听按钮監視を設定する

//启动监听服务
void MainWindow::on_setListen_released()
{
    
    
    unsigned short port =ui->port->text().toUShort();
    m_server->listen(QHostAddress::Any,port);
    ui->setListen->setDisabled(true);//

}

パラメータ:

  • address :自動バインドを示す、クラスを通じてカプセル化およびフォーマットQHostAddressできるIP アドレス。IPv4IPv6QHostAddress::Any
  • port : 0 として指定した場合、使用可能なポートをランダムにバインドすることを意味します。戻り値: バインドが成功した場合は返されtrue、失敗した場合は返されますfalse

現在のオブジェクトが監視しているかどうかを判断し、監視していない場合は true を返し、false を返します。

bool QTcpServer::isListening() const;

現在のオブジェクトがリッスンしている場合は、リッスンしているサーバーのアドレス情報を返し、それ以外の場合は返します。QHostAddress::Null

QHostAddress QTcpServer::serverAddress() const;

サーバーが接続を待機している場合はサーバーのポートを返し、それ以外の場合は 0 を返します。

quint16 QTcpServer::serverPort() const

サービスターミナルQTcpSocket

QTcpSocketこれは、クライアントとサーバーの両方で使用する必要があるソケット通信クラスです。データの送受信もQtIO 操作 (ネットワーク IO) です。まず、このクラスの継承関係を見てみましょう。




ここに画像の説明を挿入します

クライアントとの接続確立後、通信に使用するソケットオブジェクトを取得しますQTcpSocket。これはQTcpServerサブオブジェクトです。QTcpServerオブジェクトが破棄されると、このサブオブジェクトも自動的に破棄されます。もちろん、手動で破棄することもできます。推奨されます。この通信QTcpSocketオブジェクトを手動で破棄してください。

QTcpSocket *QTcpServer::nextPendingConnection();

クライアントによって開始された接続要求をブロックして待機することは、シングル スレッド プログラムでの使用には推奨されwaitForNewConnection()ません。新しい接続を処理するには、非ブロッキング メソッド、つまりシグナルを使用することをお勧めしますnewConnection()

bool QTcpServer::waitForNewConnection(int msec = 0, bool *timedOut = Q_NULLPTR);

パラメータ:

  1. msec: ブロックする最大期間をミリ秒単位で指定します ( ms)。
  2. timeout: 送信パラメータ。操作がタイムアウトしてもtimeoutタイムアウトtrueはありませんtimeoutfalse

ソケット通信時の信号

1.QTcpSocketソケット通信のプロセスで、このタイプのオブジェクトがreadyRead()シグナルを発行した場合、それはピアによって送信されたデータに到達したことを意味し、readAll ()データを受信するために関数を呼び出すことができます。

[signal] void QIODevice::readyRead();

公式説明

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()関数を呼び出して接続を正常に確立した後、シグナルを送信しますconnected()

[signal] void QAbstractSocket::connected();

3. ソケットが切断されると、disconnected() シグナルが発行されます。

[signal] void QAbstractSocket::disconnected();

ここに画像の説明を挿入します

ここに画像の説明を挿入します

ここに画像の説明を挿入します

データを受信する

// 指定可接收的最大字节数 maxSize 的数据到指针 data 指向的内存中
qint64 QIODevice::read(char *data, qint64 maxSize);
// 指定可接收的最大字节数 maxSize,返回接收的字符串
QByteArray QIODevice::read(qint64 maxSize);
// 将当前可用操作数据全部读出,通过返回值返回读出的字符串
QByteArray QIODevice::readAll();

データを送る

// 发送指针 data 指向的内存中的 maxSize 个字节的数据
qint64 QIODevice::write(const char *data, qint64 maxSize);
// 发送指针 data 指向的内存中的数据,字符串以 \0 作为结束标记
qint64 QIODevice::write(const char *data);
// 发送参数指定的字符串
qint64 QIODevice::write(const QByteArray &byteArray);

おすすめ

転載: blog.csdn.net/weixin_40933653/article/details/133017594