QT客戶端及服務器端的連接及數據發送

結果視圖(本機IP地址用*掩蓋了):

一,定義

服務器端:
    myServer =new QTcpServer(this);

客戶端:
    myClient = new QTcpSocket(this);

二,得到本機的ip地址

    QList<QHostAddress> addrs = QNetworkInterface::allAddresses();     //定義
    for(int i=0;i<addrs.length();i++)
    {
        QHostAddress addr=addrs.at(i);
        qDebug()<<addr.toString();                    //顯示出所有ip地址
        if(addr.toString().contains("192."))
        {
            myAddr=addr.toString();                   //將192開頭的ip賦值給myAddr
            break;
        }
    }

三,獲取ip地址以及端口號,然後連接

ip地址和端口號直接手動從lineEdit獲得(服務器和客戶端一樣)


    myAddr =ui->lineEdit_1->text();
    QString myPort = ui->lineEdit_2->text();

連接方法:

服務器端:
    myServer->listen(QHostAddress(myAddr), myPort.toUInt());

客戶端:
    myClient->connectToHost(QHostAddress(servIP),servPort.toUInt());

四,服務器端或客戶端讀取對方內容

服務器端讀取:
    QTcpSocket *client = (QTcpSocket*)this->sender();
    QString str1=QString("客戶端[%1:%2] 說:")
            .arg(client->peerAddress().toString())
            .arg(client->peerPort());
    QString msg1;
    QString msg2;
    while(!client->atEnd())
    {
        msg1.append(QString(client->readAll()));
        //QString str=QString(client->readAll());
        //msg=QString("%1%2").arg(str1).arg(str2);
        //ui->textEdit->append(msg);
    }
    msg2=QString("%1%2").arg(str1).arg(msg1);
    ui->textEdit->append(msg2);

客戶端讀取:
    QString msg;
    QString str1,str2;
    str1=QString("服務器[%1:%2] 說:").arg(myClient->peerAddress().toString()).arg(myClient->peerPort());
    while(!myClient->atEnd())
    {
        str2.append(QString(myClient->readAll()));
    }
    msg=QString("%1%2").arg(str1).arg(str2);               
    ui->textEdit->append(msg);

五,服務器端或客戶端向對方發送

服務器端:

    QString ip=ui->lineEdit_3->text();
    QString port=ui->lineEdit_4->text();                                  //獲取客戶端的ip和端口號
    for(int i=0;i<Array.length();i++)
    {
        if(Array.at(i)->peerAddress().toString() ==ip)
        {
            if(Array.at(i)->peerPort()== port.toUInt())                         //找到對應客戶端的ip和端口號,然後發送
            {
                QString msg=ui->textEdit_2->toPlainText();
                Array.at(i)->write(msg.toUtf8());                           // toUtf8支持發送漢字
                ui->textEdit_2->clear();                                     //數據發送後清空
                break;
            }
        }
    }

客戶端:
    QString msg=ui->textEdit_2->toPlainText();
    int ret=myClient->write(msg.toUtf8());                // toUtf8支持發送漢字
    if(ret<=0)
      return;
       ui->textEdit_2->clear();                                 //數據發送後清空

六,斷開

服務器端:
    QTcpSocket *client=(QTcpSocket *)this->sender();
    QString msg=QString("客戶端[%1:%2] 退出!")
            .arg(client->peerAddress().toString())
            .arg(client->peerPort());
    ui->textEdit->append(msg);
    //刪除對應客戶端
    for(int i=0;i<Array.length();i++)
    {
        if(Array.at(i)->peerAddress()==client->peerAddress())
        {
            if(Array.at(i)->peerPort()== client->peerPort())
            {
                Array.removeAt(i);
                break;
            }
        }
    }
    ui->pushButtonLink->setEnabled(true);               //斷開後,鍵恢復使用

客戶端:
    QString msg="服務器退出";
    ui->textEdit->append(msg);
    ui->pushButtonLink->setEnabled(true);               //斷開後,鍵恢復使用

七,將按鈕禁用和解開

    ui->pushButtonLink->setEnabled(false);               //禁用

    ui->pushButtonLink->setEnabled(true);              //解開

 八,服務器端和客戶端的資源鏈接

https://download.csdn.net/download/qq_46423166/12363175

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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