实现的具体功能为:
- 服务器端需要主动监听,可以主动断开连接,可以发送信息给客户端
- 客户端需要输入主机,端口号,需要主动连接,可以主动断开连接,可以发送信息给服务器端
- 服务器端和客户端都能看到聊天记录
服务器端的搭建:
创建一个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即可连接
服务器端向客户端发信息:
客户端向服务器端发信息:
点击断开连接,即可断开: