QT實現簡單TCP通信

本文實例為大傢分享瞭QT實現簡單TCP通信的具體代碼,供大傢參考,具體內容如下

開發環境:win7
開發軟件:Qt5.5.0
下圖是實現效果

首先點擊客戶端的connect與服務器連接,連接成功後再服務器會顯示“成功連接”,然後在客戶端會顯示“成功與服務器建立連接”,然後我們就可以分別在服務器和客戶端向對方發送數據瞭。

1 TCP介紹

傳輸控制協議(TCP,Transmission Control Protocol)是一種面向連接的、可靠的、基於字節流的傳輸層通信協議。

在QT中的網絡編程的過程如下:服務器有兩個套接字,一個負責監聽(QTcpServer),另一個負責通信(QTcpSocket),而客戶端隻有一個負責通信的套接字(QTcpSocket)。

通信過程如下圖:

2 Tcp服務器實現

//監聽套接字,指定父對象,讓其自動回收空間
tcpServer = new QTcpServer(this);
tcpServer->listen(QHostAddress::AnyIPv4, 6000);

當有新的連接建立時,在服務器界面接收區處顯示客戶端地址和端口,並且等待數據發送過來,接收並顯示:

connect(tcpServer, &QTcpServer::newConnection,
            [=](){
                //取出建立好連接的套接字
                //cout << "有新的客戶端進行連接";
                tcpSocket = tcpServer->nextPendingConnection();
                //獲取對方的IP和端口
                QString ip = tcpSocket->peerAddress().toString();
                quint16 port = tcpSocket->peerPort();
                QString temp = QString("[%1:%2]:成功連接").arg(ip).arg(port);        
                ui->textEditRead->setText(temp);
                
                connect(tcpSocket, &QTcpSocket::readyRead,
                        [=](){
                            //cout << "有數據從客戶端發過來";
                            //從通信套接字取出內容
                            QByteArray array = tcpSocket->readAll();
                            ui->textEditRead->append(array);
                        }
                        );
            }
            );
}

發送數據:

void ServerWidget::on_buttonSend_clicked()
{
    if(NULL == tcpSocket){
        return;
    }
    //獲取編輯區內容
    QString str = ui->textEditWrite->toPlainText();
    //給對方發送數據。使用套接字是tcpSocket
    tcpSocket->write(str.toUtf8().data());
}

點擊close按鈕,如果tcpSocket沒有分配內存,則退出,否則斷開連接。

void ServerWidget::on_buttonClose_clicked()
{
    if(NULL == tcpSocket){
        return;
    }
    //主動和客戶端斷開連接
    tcpSocket->disconnectFromHost();
    tcpSocket->close();
    tcpSocket = NULL;
}

3 TCP客戶端實現

分配空間,指定父對象

tcpSocket = new QTcpSocket(this);

如果服務器發送連接成功,則客戶端顯示“成功與服務器建立連接”。

connect(tcpSocket, &QTcpSocket::connected,
            [=](){
                ui->textEditRead->setText("成功與服務器建立連接");
            }
            );

客戶端讀取數據,並顯示在接收區

connect(tcpSocket, &QTcpSocket::readyRead,
            [=](){
                //獲取服務器發送的內容
                QByteArray array = tcpSocket->readAll();
                ui->textEditRead->append(array);
            }
            );

按下connect按鈕,主動與服務器建立連接

void ClientWidget::on_pushButtonConnect_clicked()
{
    //獲取服務器ip和端口
    QString ip = ui->lineEditIP->text();
    quint16 port = ui->lineEditPort->text().toInt();
    //主動和服務器建立連接
    tcpSocket->connectToHost(QHostAddress(ip), port);
}

按下send按鈕,發送數據,轉成utf-8格式

void ClientWidget::on_pushButtonSend_clicked()
{
    if(NULL == tcpSocket){
        return;
    }
    //獲取編輯區內容
    QString str = ui->textEditWrite->toPlainText();
    //給對方發送數據,使用套接字是tcpSocket
    tcpSocket->write(str.toUtf8().data());
}

按下close關閉連接

void ClientWidget::on_pushButtonClose_clicked()
{
    tcpSocket->disconnectFromHost();
    tcpSocket->close();
}

以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。

推薦閱讀: