QT實(shí)現(xiàn)簡(jiǎn)單TCP通信
本文實(shí)例為大家分享了QT實(shí)現(xiàn)簡(jiǎn)單TCP通信的具體代碼,供大家參考,具體內(nèi)容如下
開(kāi)發(fā)環(huán)境:win7
開(kāi)發(fā)軟件:Qt5.5.0
下圖是實(shí)現(xiàn)效果

首先點(diǎn)擊客戶端的connect與服務(wù)器連接,連接成功后再服務(wù)器會(huì)顯示“成功連接”,然后在客戶端會(huì)顯示“成功與服務(wù)器建立連接”,然后我們就可以分別在服務(wù)器和客戶端向?qū)Ψ桨l(fā)送數(shù)據(jù)了。
1 TCP介紹
傳輸控制協(xié)議(TCP,Transmission Control Protocol)是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議。
在QT中的網(wǎng)絡(luò)編程的過(guò)程如下:服務(wù)器有兩個(gè)套接字,一個(gè)負(fù)責(zé)監(jiān)聽(tīng)(QTcpServer),另一個(gè)負(fù)責(zé)通信(QTcpSocket),而客戶端只有一個(gè)負(fù)責(zé)通信的套接字(QTcpSocket)。
通信過(guò)程如下圖:

2 Tcp服務(wù)器實(shí)現(xiàn)
//監(jiān)聽(tīng)套接字,指定父對(duì)象,讓其自動(dòng)回收空間 tcpServer = new QTcpServer(this); tcpServer->listen(QHostAddress::AnyIPv4, 6000);
當(dāng)有新的連接建立時(shí),在服務(wù)器界面接收區(qū)處顯示客戶端地址和端口,并且等待數(shù)據(jù)發(fā)送過(guò)來(lái),接收并顯示:
connect(tcpServer, &QTcpServer::newConnection,
? ? ? ? ? ? [=](){
? ? ? ? ? ? ? ? //取出建立好連接的套接字
? ? ? ? ? ? ? ? //cout << "有新的客戶端進(jìn)行連接";
? ? ? ? ? ? ? ? tcpSocket = tcpServer->nextPendingConnection();
? ? ? ? ? ? ? ? //獲取對(duì)方的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 << "有數(shù)據(jù)從客戶端發(fā)過(guò)來(lái)";
? ? ? ? ? ? ? ? ? ? ? ? ? ? //從通信套接字取出內(nèi)容
? ? ? ? ? ? ? ? ? ? ? ? ? ? QByteArray array = tcpSocket->readAll();
? ? ? ? ? ? ? ? ? ? ? ? ? ? ui->textEditRead->append(array);
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? );
? ? ? ? ? ? }
? ? ? ? ? ? );
}發(fā)送數(shù)據(jù):
void ServerWidget::on_buttonSend_clicked()
{
? ? if(NULL == tcpSocket){
? ? ? ? return;
? ? }
? ? //獲取編輯區(qū)內(nèi)容
? ? QString str = ui->textEditWrite->toPlainText();
? ? //給對(duì)方發(fā)送數(shù)據(jù)。使用套接字是tcpSocket
? ? tcpSocket->write(str.toUtf8().data());
}點(diǎn)擊close按鈕,如果tcpSocket沒(méi)有分配內(nèi)存,則退出,否則斷開(kāi)連接。
void ServerWidget::on_buttonClose_clicked()
{
? ? if(NULL == tcpSocket){
? ? ? ? return;
? ? }
? ? //主動(dòng)和客戶端斷開(kāi)連接
? ? tcpSocket->disconnectFromHost();
? ? tcpSocket->close();
? ? tcpSocket = NULL;
}3 TCP客戶端實(shí)現(xiàn)
分配空間,指定父對(duì)象
tcpSocket = new QTcpSocket(this);
如果服務(wù)器發(fā)送連接成功,則客戶端顯示“成功與服務(wù)器建立連接”。
connect(tcpSocket, &QTcpSocket::connected,
? ? ? ? ? ? [=](){
? ? ? ? ? ? ? ? ui->textEditRead->setText("成功與服務(wù)器建立連接");
? ? ? ? ? ? }
? ? ? ? ? ? );客戶端讀取數(shù)據(jù),并顯示在接收區(qū)
connect(tcpSocket, &QTcpSocket::readyRead,
? ? ? ? ? ? [=](){
? ? ? ? ? ? ? ? //獲取服務(wù)器發(fā)送的內(nèi)容
? ? ? ? ? ? ? ? QByteArray array = tcpSocket->readAll();
? ? ? ? ? ? ? ? ui->textEditRead->append(array);
? ? ? ? ? ? }
? ? ? ? ? ? );按下connect按鈕,主動(dòng)與服務(wù)器建立連接
void ClientWidget::on_pushButtonConnect_clicked()
{
? ? //獲取服務(wù)器ip和端口
? ? QString ip = ui->lineEditIP->text();
? ? quint16 port = ui->lineEditPort->text().toInt();
? ? //主動(dòng)和服務(wù)器建立連接
? ? tcpSocket->connectToHost(QHostAddress(ip), port);
}按下send按鈕,發(fā)送數(shù)據(jù),轉(zhuǎn)成utf-8格式
void ClientWidget::on_pushButtonSend_clicked()
{
? ? if(NULL == tcpSocket){
? ? ? ? return;
? ? }
? ? //獲取編輯區(qū)內(nèi)容
? ? QString str = ui->textEditWrite->toPlainText();
? ? //給對(duì)方發(fā)送數(shù)據(jù),使用套接字是tcpSocket
? ? tcpSocket->write(str.toUtf8().data());
}按下close關(guān)閉連接
void ClientWidget::on_pushButtonClose_clicked()
{
? ? tcpSocket->disconnectFromHost();
? ? tcpSocket->close();
}以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Qt中TCP協(xié)議通信詳解
- Qt實(shí)現(xiàn)簡(jiǎn)單的TCP通信
- QT編寫tcp通信工具(Client篇)
- QT網(wǎng)絡(luò)通信TCP客戶端實(shí)現(xiàn)詳解
- Qt?TCP網(wǎng)絡(luò)通信學(xué)習(xí)
- Qt網(wǎng)絡(luò)編程實(shí)現(xiàn)TCP通信
- QT5實(shí)現(xiàn)簡(jiǎn)單的TCP通信的實(shí)現(xiàn)
- 基于QT的TCP通信服務(wù)的實(shí)現(xiàn)
- QT網(wǎng)絡(luò)編程Tcp下C/S架構(gòu)的即時(shí)通信實(shí)例
- Qt TCP實(shí)現(xiàn)簡(jiǎn)單通信功能
相關(guān)文章
淺談stringstream 的.str()正確用法和清空操作
下面小編就為大家?guī)?lái)一篇淺談stringstream 的.str()正確用法和清空操作。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12
C/C++中接收return返回來(lái)的數(shù)組元素方法示例
return是C++預(yù)定義的語(yǔ)句,它提供了種植函數(shù)執(zhí)行的一種放大,最近學(xué)習(xí)中遇到了相關(guān)return的內(nèi)容,覺(jué)著有必要總結(jié)一下,這篇文章主要給大家介紹了關(guān)于C/C++中如何接收return返回來(lái)的數(shù)組元素的相關(guān)資料,需要的朋友可以參考下。2017-12-12
C++調(diào)用C#的DLL實(shí)現(xiàn)方法
這篇文章主要介紹了C++調(diào)用C#的DLL實(shí)現(xiàn)方法,很有實(shí)用價(jià)值,需要的朋友可以參考下2014-07-07
C語(yǔ)言 詳細(xì)分析結(jié)構(gòu)體的內(nèi)存對(duì)齊
C 數(shù)組允許定義可存儲(chǔ)相同類型數(shù)據(jù)項(xiàng)的變量,結(jié)構(gòu)是 C 編程中另一種用戶自定義的可用的數(shù)據(jù)類型,它允許你存儲(chǔ)不同類型的數(shù)據(jù)項(xiàng),本篇讓我們來(lái)了解C 的結(jié)構(gòu)體內(nèi)存對(duì)齊2022-03-03
sublime text3搭建配置c語(yǔ)言編譯環(huán)境的詳細(xì)圖解教程(小白級(jí))
這篇文章主要介紹了sublime text3搭建配置c語(yǔ)言編譯環(huán)境,詳細(xì)圖解,小白教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-01-01
C++實(shí)現(xiàn)順序表的常用操作(插入刪出查找輸出)
實(shí)現(xiàn)順序表的插入,刪除,查找,輸出操作在C語(yǔ)言中經(jīng)常用到。下面小編給大家整理實(shí)現(xiàn)代碼,一起看下吧2016-08-08
C語(yǔ)言rand和srand函數(shù)使用方法介紹
rand()函數(shù)用來(lái)產(chǎn)生隨機(jī)數(shù),但是,rand()的內(nèi)部實(shí)現(xiàn)是用線性同余法實(shí)現(xiàn)的,是偽隨機(jī)數(shù),由于周期較長(zhǎng),因此在一定范圍內(nèi)可以看成是隨機(jī)的。srand()用來(lái)設(shè)置rand()產(chǎn)生隨機(jī)數(shù)時(shí)的隨機(jī)數(shù)種子。參數(shù)seed是整數(shù),通??梢岳胻ime(0)或geypid(0)的返回值作為seed2023-02-02

