实现的具体功能为:
- 服务器端需要主动监听,可以主动断开连接,可以发送信息给客户端
- 客户端需要输入主机,端口号,需要主动连接,可以主动断开连接,可以发送信息给服务器端
- 服务器端和客户端都能看到聊天记录
服务器端的搭建:
创建一个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即可连接
服务器端向客户端发信息:
客户端向服务器端发信息:
点击断开连接,即可断开:
标签:Qt,tcp,server,client,ui,TCP,QMessageBox,socket,聊天 From: https://www.cnblogs.com/ybqjymy/p/18073744