結果視圖(本機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