QT網絡編程——TCP客戶端連接到服務器

前言

1.在Qt中,QtNetwork模塊是用來進行網絡編程,Qt提供了一層統一的套接字抽象用於編寫不同層次的網絡程序,避免了應用套接字進行網絡編的繁瑣,對不同平臺,Qt都可以很好的支持,不用另外添加別的庫。
2.而TCP:(Transmission Control Protocol 傳輸控制協議)是網絡編程的其中一種,它是面向連接的相對可靠的基於字節流的傳輸層通信協議。相比UDP的開放式無連接不可靠的傳輸層通信協議安全性要好一些。
3.我的開發環境是:QT Creator 5.7,我最終的項目是想做成客戶端與服務器能互發文本信息,上傳、下載文件,互發圖像文件,就是客戶端往服務器發送圖像,服務器器接收成功之後,使用OpenCV做相關的圖像處理之後返回之前發出的服務器。

服務器

1.新建一個TCPServer的項目,然後在pro文件裏面添加QtNetwork模型。代碼如下:

QT     += network

2.因爲可視化可以更好的體現整個流程,這裏我用Qt搭了一個簡易的界面,如下圖:
在這裏插入圖片描述
這裏我指定的服務器的IP地址爲127.0.0.1,端口是8000,這個也可以按自己的需求改。
3.然後給監聽這個功能添加代碼,運行程序之後,只有你點擊監聽這個按鍵,服務器纔算正式啓動,開始監聽是新的客戶端開始連接。

//啓動服務器開始監聽
void Server::on_buttonMonitor_clicked()
{
    //監聽所有IP地址
    bool monitor = tcpServer->listen(QHostAddress::Any,ui->lineEditServerPorts->text().toInt());
    //按鍵狀態
    if(monitor)
    {
        ui->buttonMonitor->setEnabled(false);
        ui->buttonDisconnect->setEnabled(true);
        ui->textEditStatus->append("開始監端口......");

    }
    else
    {
        ui->textEditStatus->append("啓動服務器失敗!");
    }
}

4.斷開服務器,當有客戶端還連接的時候,會等待指定的時間之後再斷開。

//斷開與所有客戶端的連接
void Server::on_buttonDisconnect_clicked()
{
    //如果有客戶端連接
    if(tcpClient.length() > 0)
    {
        for(int i = 0; i < tcpClient.length();i++)
        {
            //斷開
            tcpClient.at(i)->disconnectFromHost();
            //等待
            bool dis = tcpClient.at(i)->waitForDisconnected(10000);
            if(dis)
            {
                //刪除客戶端
                tcpClient.removeAt(i);
            }
            else
            {
                ui->textEditStatus->append("斷開連接失敗!");
            }
        }
        tcpServer->close();
        ui->buttonMonitor->setEnabled(true);
        ui->buttonDisconnect->setEnabled(false);
        ui->textEditStatus->append("斷開連接成功!");
    }
    else
    {
        ui->textEditStatus->append("當前沒有連接的客戶端!");
    }
}

客戶端

1.新建一個TCPClient的項目,然後在pro文件裏面添加QtNetwork模型。代碼如下:

QT     += network

2.客商的界面如下圖:
在這裏插入圖片描述
3.連接按鍵添加代碼。

//連接服務器
void Client::on_buttonConnect_clicked()
{
    tcpClient->connectToHost(ui->lineEditServerIP->text(),ui->lineEditServerPorts->text().toInt());
    if(tcpClient->waitForConnected(10000))
    {
        ui->buttonConnect->setEnabled(false);
        ui->buttonDisconnect->setEnabled(true);
        ui->buttonSendMessage->setEnabled(true);
        ui->textEditStatus->append("連接服務器成功!");
    }
    else
    {
        ui->textEditStatus->append("連接失敗,請檢查IP地址和端口!");
    }
}

4.斷開與服務器的連接

//斷開
void Client::on_buttonDisconnect_clicked()
{
    tcpClient->disconnectFromHost();
    //斷開成功
    if (tcpClient->state() == QAbstractSocket::UnconnectedState || tcpClient->waitForDisconnected(1000))
    {
        ui->buttonConnect->setEnabled(true);
        ui->textEditStatus->append("連接已斷開!");
        ui->buttonDisconnect->setEnabled(false);
        ui->buttonConnect->setEnabled(true);

    }
    else
    {
        ui->textEditStatus->append("無法斷開與服務器的連接!");
    }
}

測試

1.都添加了代碼,就開始測試是否可以連接,首先先啓動服務器端,然後輸入IP地址和端口,按一監聽鍵,開始監聽。
在這裏插入圖片描述
2.啓動客戶端,輸入服務器的IP地址和端口,點連接按鈕,開始連接到服務器。
在這裏插入圖片描述
3.當前客戶端已經連接上客服器,那接下要做的事,如果讓客戶端往服務器發信息,或者服務器把信息返回給客戶端,或者以廣播的形式向所有連接到的客戶端都發信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章