Qt TCP (小型聊天視窗)

一杯清酒邀明月發表於2024-03-14

實現的具體功能為:

  1. 伺服器端需要主動監聽,可以主動斷開連線,可以傳送資訊給客戶端
  2. 客戶端需要輸入主機,埠號,需要主動連線,可以主動斷開連線,可以傳送資訊給伺服器端
  3. 伺服器端和客戶端都能看到聊天記錄

伺服器端的搭建:

建立一個TCP_Server專案

1.首先在.Pro檔案中新增:

QT+=network

ui介面中新增以下控制元件:

2. tcp_server.h檔案

 1 #ifndef TCP_SERVER_H
 2 #define TCP_SERVER_H
 3  
 4 #include <QWidget>
 5 #include<QTcpServer>
 6 #include<QTcpSocket>
 7 QT_BEGIN_NAMESPACE
 8 namespace Ui { class tcp_server; }
 9 QT_END_NAMESPACE
10  
11 class tcp_server : public QWidget
12 {
13     Q_OBJECT
14  
15 public:
16     tcp_server(QWidget *parent = nullptr);
17     ~tcp_server();
18  
19 private slots:
20     void on_pushButton_clicked();
21  
22     void on_pushButton_3_clicked();
23  
24     void on_pushButton_2_clicked();
25  
26 private:
27     Ui::tcp_server *ui;
28     QTcpServer * server;//伺服器物件
29     QTcpSocket * socket=nullptr;//套接字
30  
31  
32 };
33 #endif // TCP_SERVER_H

3.tcp_server.cpp檔案

 1 #include "tcp_server.h"
 2 #include "ui_tcp_server.h"
 3 #include<QMessageBox>
 4 tcp_server::tcp_server(QWidget *parent)
 5     : QWidget(parent)
 6     , ui(new Ui::tcp_server)
 7 {
 8     ui->setupUi(this);
 9     server=new QTcpServer(this);
10     connect(server,&QTcpServer::newConnection,[=]()//當有連線時
11     {
12         int ret=QMessageBox::information(this,"提示資訊","已有連線,是否連線。",QMessageBox::Yes|QMessageBox::No);
13         if(ret==QMessageBox::Yes)
14         {
15             QMessageBox::information(this,"提示資訊","已成功連線。",QMessageBox::Ok);
16             socket=new QTcpSocket;
17             socket=server->nextPendingConnection();//獲取套接字
18             connect(socket,&QTcpSocket::readyRead,[=]()//如果有新資料
19             {
20                 QByteArray S=socket->readAll();//讀取全部內容
21                 QString str=S.data();//轉化為字串格式
22                 ui->textEdit->append(QString("客戶端:%1").arg(str));//把資料新增到textEdit中
23             });
24             connect(socket,&QTcpSocket::disconnected,socket,&QTcpSocket::deleteLater);//斷開連線後,刪除該套接字
25         }
26         else
27         {
28             QMessageBox::information(this,"提示資訊","已拒絕連線。",QMessageBox::Ok);
29         }
30  
31     });
32  
33 }
34  
35 tcp_server::~tcp_server()
36 {
37     delete ui;
38 }
39  
40  
41 void tcp_server::on_pushButton_clicked()//listen
42 {
43     //監聽主機和埠
44     if(!server->listen(QHostAddress("127.0.0.1"),6000))
45     {
46         QMessageBox::information(this,"提示資訊","未監聽成功",QMessageBox::Ok);
47     }
48 }
49  
50 void tcp_server::on_pushButton_3_clicked()//斷開連線
51 {
52     if(socket==nullptr)
53     {
54         QMessageBox::information(this,"提示資訊","暫無連線。",QMessageBox::Ok);
55     }
56     else
57     {
58         socket->disconnectFromHost();//斷開連線,如有未接收完的資料,要先接收完
59         QMessageBox::information(this,"提示資訊","已成功斷開。",QMessageBox::Ok);
60         delete socket;//釋放記憶體
61         socket=nullptr;//置空
62     }
63  
64 }
65  
66 void tcp_server::on_pushButton_2_clicked()//傳送資料
67 {
68     if(socket==nullptr)
69     {
70         QMessageBox::information(this,"提示資訊","暫無連線,無法傳輸資料。",QMessageBox::Ok);
71     }
72     else
73     {
74         ui->textEdit->append(QString("伺服器端:%1").arg(ui->lineEdit->text()));//把記錄放在textEdit中
75         QByteArray S=ui->lineEdit->text().toUtf8();//將QString轉化為QByteQrray
76         socket->write(S);//傳輸資料
77     }
78 }

客戶端的搭建:

建立一個TCP_Client專案

1.pro檔案新增

QT+=network

ui介面中新增:

2. tcp_client.h檔案

 1 #ifndef TCP_CLIENT_H
 2 #define TCP_CLIENT_H
 3  
 4 #include <QWidget>
 5 #include<QTcpSocket>
 6 QT_BEGIN_NAMESPACE
 7 namespace Ui { class tcp_client; }
 8 QT_END_NAMESPACE
 9  
10 class tcp_client : public QWidget
11 {
12     Q_OBJECT
13  
14 public:
15     tcp_client(QWidget *parent = nullptr);
16     ~tcp_client();
17  
18 private slots:
19     void on_pushButton_clicked();//連線
20  
21     void on_pushButton_2_clicked();//斷開
22  
23     void on_pushButton_3_clicked();//傳送
24  
25 private:
26     Ui::tcp_client *ui;
27     QTcpSocket *Socket;//套接字
28  
29 };
30 #endif // TCP_CLIENT_H

3.tcp_client.cpp檔案

 1 #include "tcp_client.h"
 2 #include "ui_tcp_client.h"
 3 #include<QMessageBox>
 4 tcp_client::tcp_client(QWidget *parent)
 5     : QWidget(parent)
 6     , ui(new Ui::tcp_client)
 7 {
 8     ui->setupUi(this);
 9     Socket=new QTcpSocket(this);
10     connect(Socket,&QTcpSocket::readyRead,[=]()
11     {
12         QByteArray bt=Socket->readAll();//讀取伺服器傳送的內容
13         QString str=bt.data();//轉化為QString
14         ui->textEdit->append(QString("伺服器:%1").arg(str));//把內容放在textEdit
15     });
16  
17 }
18  
19 tcp_client::~tcp_client()
20 {
21     delete ui;
22 }
23  
24  
25 void tcp_client::on_pushButton_clicked()//連線到伺服器
26 {
27     Socket->abort();//斷開已有連線
28     Socket->connectToHost(ui->lineEdit->text(),ui->lineEdit_2->text().toInt());//連線到伺服器
29 }
30  
31 void tcp_client::on_pushButton_2_clicked()//斷開
32 {
33     Socket->disconnectFromHost();//斷開連線
34     QMessageBox::information(this,"提示資訊","已斷開",QMessageBox::Ok);
35 }
36  
37 void tcp_client::on_pushButton_3_clicked()//傳送
38 {
39     if(Socket->state()==QAbstractSocket::ConnectedState)//如果為連線狀態
40     {
41         ui->textEdit->append(QString("客戶端:%1").arg(ui->lineEdit_3->text()));//把內容新增到textEdit中
42         QByteArray bta=ui->lineEdit_3->text().toUtf8();
43         Socket->write(bta);//傳輸資料
44     }
45     else
46     {
47         QMessageBox::information(this,"提示資訊","未連線,無法傳送",QMessageBox::Ok);
48     }
49 }

以下為執行過程:

輸入主機和埠號然後點選連線,然後點選listen監聽

點選yes即可連線

伺服器端向客戶端發資訊:

客戶端向伺服器端發資訊:

點選斷開連線,即可斷開:

相關文章