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。