實現的具體功能為:
- 伺服器端需要主動監聽,可以主動斷開連線,可以傳送資訊給客戶端
- 客戶端需要輸入主機,埠號,需要主動連線,可以主動斷開連線,可以傳送資訊給伺服器端
- 伺服器端和客戶端都能看到聊天記錄
伺服器端的搭建:
建立一個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即可連線
伺服器端向客戶端發資訊:
客戶端向伺服器端發資訊:
點選斷開連線,即可斷開: