Qt TCP通訊簡易Demo

原文:https://blog.csdn.net/uyy203/article/details/54960276

在Qt上建立Tcp server 和 client 間的簡易通訊蝴乔,實(shí)現(xiàn)效果如下


image.png

首先要記得在工程目錄中的pro文件中 加入 傲醉,這樣才能開啟網(wǎng)絡(luò)服務(wù)

QT += network

//mainwindow.h

#include "tcpserverwindow.h"
#include "ui_tcpserverwindow.h"
 
TcpServerWindow::TcpServerWindow(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::TcpServerWindow)
{
    ui->setupUi(this);
 
    tcpSocket=new QTcpSocket(this);
    tcpServer=new QTcpServer(this);
 
    setListener();
 
     /**信號與槽**/
 
    //newConnection()用于當(dāng)有客戶端訪問時發(fā)出信號,acceptConnection()信號處理函數(shù)
    connect(tcpServer,SIGNAL(newConnection()),this,SLOT(acceptConnection()));
 
    //當(dāng)tcpSocket在接受客戶端連接時出現(xiàn)錯誤時另锋,displayError(QAbstractSocket::SocketError)進(jìn)行錯誤提醒并關(guān)閉tcpSocket总处。
    connect(tcpSocket,SIGNAL(error(QAbstractSocket::SocketError)),SLOT(displayError(QAbstractSocket::SocketError)));
 
}
 
 
    //監(jiān)聽是否有客戶端來訪狈惫,且對任何來訪者監(jiān)聽,端口為6666
void TcpServerWindow::setListener(){
    if(!tcpServer->listen(QHostAddress::Any,6666)){
         qDebug()<<tcpServer->errorString();
        close();
    }else {
        qDebug()<<"listening";
    }
 
}
 
 
void TcpServerWindow::displayError(QAbstractSocket::SocketError)
 
{
 
   qDebug()<<tcpSocket->errorString();
 
   tcpSocket->close();
 
}
 
 
void TcpServerWindow::acceptConnection(){
    tcpSocket=tcpServer->nextPendingConnection();
}
 
 
 
TcpServerWindow::~TcpServerWindow()
{
    delete ui;
}
 
//點(diǎn)擊發(fā)送按鈕發(fā)送消息
void TcpServerWindow::on_SendBtn_clicked()
{
    //以utf-8字符集格式發(fā)送鹦马,支持中文
    tcpSocket->write(ui->SendText->text().toUtf8());
 
    //以拉丁字符集格式發(fā)送
//    tcpSocket->write(ui->SendText->text().toLatin1());
}

//mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
 
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
    tcpServerWindow=new TcpServerWindow;
    tcpClientWindow=new TcpClientWindow;
 
 
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
void MainWindow::on_server_clicked()
{
    tcpServerWindow->show();
 
}
 
void MainWindow::on_client_clicked()
{
    tcpClientWindow->show();
}

*************Client***************

//tcpclientwindow.h

#ifndef TCPCLIENTWINDOW_H
#define TCPCLIENTWINDOW_H
 
#include<QtNetwork/QTcpSocket>
#include<QtNetwork>
#include <QDialog>
 
namespace Ui {
class TcpClientWindow;
}
 
class TcpClientWindow : public QDialog
{
    Q_OBJECT
 
public:
    explicit TcpClientWindow(QWidget *parent = 0);
    ~TcpClientWindow();
 
private:
    Ui::TcpClientWindow *ui;
 
    QTcpSocket *tcpSocket;
 
    void newTcpConnection();
 
private slots:
    void displayError(QAbstractSocket::SocketError);
    void revData();
};
 
#endif // TCPCLIENTWINDOW_H

//tcpclientwindow.cpp

#include "tcpclientwindow.h"
#include "ui_tcpclientwindow.h"
 
TcpClientWindow::TcpClientWindow(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::TcpClientWindow)
{
    ui->setupUi(this);
 
    tcpSocket=new QTcpSocket(this);
 
    newTcpConnection();
 
    /**信號與槽**/
 
    //readyRead()表示服務(wù)端發(fā)送數(shù)據(jù)過來即發(fā)動信號胧谈,接著revData()進(jìn)行處理。
    connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(revData()));
 
    connect(tcpSocket,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(displayError(QAbstractSocket::SocketError)));
 
 
}
 
    //接收字符串
void TcpClientWindow::revData(){
    QString data=tcpSocket->readAll();
    ui->ReceiveText->setText(data);
}
 
//新建連接
void TcpClientWindow::newTcpConnection(){
    tcpSocket->abort();
    tcpSocket->connectToHost("127.0.0.1",6666);
 
    }
 
void TcpClientWindow::displayError(QAbstractSocket::SocketError){
    qDebug()<<tcpSocket->errorString();
    tcpSocket->close();
}
 
 
TcpClientWindow::~TcpClientWindow()
{
    delete ui;
}

***************Server***************

//tcpserverwindow.h

#ifndef TCPSERVERWINDOW_H
#define TCPSERVERWINDOW_H
 
#include<QtNetwork/QTcpSocket>
#include<QtNetwork/QTcpServer>
#include <QDialog>
 
namespace Ui {
class TcpServerWindow;
}
 
class TcpServerWindow : public QDialog
{
    Q_OBJECT
 
public:
    explicit TcpServerWindow(QWidget *parent = 0);
    ~TcpServerWindow();
 
private:
    Ui::TcpServerWindow *ui;
 
    QTcpSocket *tcpSocket;
    QTcpServer *tcpServer;
 
    void setListener();
 
 
private slots:
 
    void acceptConnection();
 
    void displayError(QAbstractSocket::SocketError);
 
    void on_SendBtn_clicked();
};
 
#endif // TCPSERVERWINDOW_H

//tcpserverwindow.cpp

#include "tcpserverwindow.h"
#include "ui_tcpserverwindow.h"
 
TcpServerWindow::TcpServerWindow(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::TcpServerWindow)
{
    ui->setupUi(this);
 
    tcpSocket=new QTcpSocket(this);
    tcpServer=new QTcpServer(this);
 
    setListener();
 
     /**信號與槽**/
 
    //newConnection()用于當(dāng)有客戶端訪問時發(fā)出信號荸频,acceptConnection()信號處理函數(shù)
    connect(tcpServer,SIGNAL(newConnection()),this,SLOT(acceptConnection()));
 
    //當(dāng)tcpSocket在接受客戶端連接時出現(xiàn)錯誤時菱肖,displayError(QAbstractSocket::SocketError)進(jìn)行錯誤提醒并關(guān)閉tcpSocket。
    connect(tcpSocket,SIGNAL(error(QAbstractSocket::SocketError)),SLOT(displayError(QAbstractSocket::SocketError)));
 
}
 
 
    //監(jiān)聽是否有客戶端來訪旭从,且對任何來訪者監(jiān)聽稳强,端口為6666
void TcpServerWindow::setListener(){
    if(!tcpServer->listen(QHostAddress::Any,6666)){
         qDebug()<<tcpServer->errorString();
        close();
    }else {
        qDebug()<<"listening";
    }
 
}
 
 
void TcpServerWindow::displayError(QAbstractSocket::SocketError)
 
{
 
   qDebug()<<tcpSocket->errorString();
 
   tcpSocket->close();
 
}
 
 
void TcpServerWindow::acceptConnection(){
    tcpSocket=tcpServer->nextPendingConnection();
}
 
 
 
TcpServerWindow::~TcpServerWindow()
{
    delete ui;
}
 
//點(diǎn)擊發(fā)送按鈕發(fā)送消息
void TcpServerWindow::on_SendBtn_clicked()
{
    //以utf-8字符集格式發(fā)送,支持中文
    tcpSocket->write(ui->SendText->text().toUtf8());
 
    //以拉丁字符集格式發(fā)送
//    tcpSocket->write(ui->SendText->text().toLatin1());
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末和悦,一起剝皮案震驚了整個濱河市退疫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鸽素,老刑警劉巖褒繁,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異馍忽,居然都是意外死亡棒坏,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門遭笋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坝冕,“玉大人,你說我怎么就攤上這事瓦呼∥箍撸” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵央串,是天一觀的道長谎替。 經(jīng)常有香客問我,道長蹋辅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任挫掏,我火速辦了婚禮侦另,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己褒傅,他們只是感情好弃锐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著殿托,像睡著了一般霹菊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上支竹,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天旋廷,我揣著相機(jī)與錄音,去河邊找鬼礼搁。 笑死饶碘,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的馒吴。 我是一名探鬼主播扎运,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼饮戳!你這毒婦竟也來了豪治?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤扯罐,失蹤者是張志新(化名)和其女友劉穎负拟,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體篮赢,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡齿椅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了启泣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涣脚。...
    茶點(diǎn)故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖寥茫,靈堂內(nèi)的尸體忽然破棺而出遣蚀,到底是詐尸還是另有隱情,我是刑警寧澤纱耻,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布芭梯,位于F島的核電站,受9級特大地震影響弄喘,放射性物質(zhì)發(fā)生泄漏玖喘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一蘑志、第九天 我趴在偏房一處隱蔽的房頂上張望累奈。 院中可真熱鬧贬派,春花似錦、人聲如沸澎媒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽戒努。三九已至请敦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間储玫,已是汗流浹背侍筛。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缘缚,地道東北人勾笆。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像桥滨,于是被迫代替她去往敵國和親窝爪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容

  • ------------------------------------------------- Project...
    動感新勢力fan閱讀 724評論 0 0
  • 1齐媒、TCP狀態(tài)linux查看tcp的狀態(tài)命令:1)蒲每、netstat -nat 查看TCP各個狀態(tài)的數(shù)量2)、lso...
    北辰青閱讀 9,429評論 0 11
  • 1.Qt概述 1.1 什么是Qt Qt是一個跨平臺的C++圖形用戶界面應(yīng)用程序框架喻括。它為應(yīng)用程序開發(fā)者提供建立藝術(shù)...
    你的社交帳號昵閱讀 8,719評論 0 10
  • 我款款而來 來約赴這一個花期 這一刻 我為你來 你為我開 自然合一 寂靜歡喜
    自由貓貓閱讀 162評論 0 0
  • 以我現(xiàn)在的資質(zhì)和年齡其實(shí)根本沒有資格妄議關(guān)于企業(yè)管理的任何話題邀杏。但《華為哲學(xué)任正非的企業(yè)之道》這本書卻如浩瀚...
    sisilulu閱讀 614評論 0 0