一杯清酒邀明月
天下本无事,庸人扰之而烦耳。

实现的具体功能为:

  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即可连接

 服务器端向客户端发信息:

 客户端向服务器端发信息:

  点击断开连接,即可断开:

 

posted on 2024-03-14 19:22  一杯清酒邀明月  阅读(35)  评论(0编辑  收藏  举报