实现的具体功能为:
- 服务器端需要主动监听,可以主动断开连接,可以发送信息给客户端
- 客户端需要输入主机,端口号,需要主动连接,可以主动断开连接,可以发送信息给服务器端
- 服务器端和客户端都能看到聊天记录
服务器端的搭建:
创建一个TCP_Server项目
1.首先在.Pro文件中添加:
QT+=network
ui界面中添加以下控件:
2. tcp_server.h文件
#ifndef TCP_SERVER_H
#define TCP_SERVER_H
#include <QWidget>
#include<QTcpServer>
#include<QTcpSocket>
QT_BEGIN_NAMESPACE
namespace Ui { class tcp_server; }
QT_END_NAMESPACE
class tcp_server : public QWidget
{
Q_OBJECT
public:
tcp_server(QWidget *parent = nullptr);
~tcp_server();
private slots:
void on_pushButton_clicked();
void on_pushButton_3_clicked();
void on_pushButton_2_clicked();
private:
Ui::tcp_server *ui;
QTcpServer * server;//服务器对象
QTcpSocket * socket=nullptr;//套接字
};
#endif // TCP_SERVER_H
3.tcp_server.cpp文件
#include "tcp_server.h"
#include "ui_tcp_server.h"
#include<QMessageBox>
tcp_server::tcp_server(QWidget *parent)
: QWidget(parent)
, ui(new Ui::tcp_server)
{
ui->setupUi(this);
server=new QTcpServer(this);
connect(server,&QTcpServer::newConnection,[=]()//当有连接时
{
int ret=QMessageBox::information(this,"提示信息","已有连接,是否连接。",QMessageBox::Yes|QMessageBox::No);
if(ret==QMessageBox::Yes)
{
QMessageBox::information(this,"提示信息","已成功连接。",QMessageBox::Ok);
socket=new QTcpSocket;
socket=server->nextPendingConnection();//获取套接字
connect(socket,&QTcpSocket::readyRead,[=]()//如果有新数据
{
QByteArray S=socket->readAll();//读取全部内容
QString str=S.data();//转化为字符串格式
ui->textEdit->append(QString("客户端:%1").arg(str));//把数据添加到textEdit中
});
connect(socket,&QTcpSocket::disconnected,socket,&QTcpSocket::deleteLater);//断开连接后,删除该套接字
}
else
{
QMessageBox::information(this,"提示信息","已拒绝连接。",QMessageBox::Ok);
}
});
}
tcp_server::~tcp_server()
{
delete ui;
}
void tcp_server::on_pushButton_clicked()//listen
{
//监听主机和端口
if(!server->listen(QHostAddress("127.0.0.1"),6000))
{
QMessageBox::information(this,"提示信息","未监听成功",QMessageBox::Ok);
}
}
void tcp_server::on_pushButton_3_clicked()//断开连接
{
if(socket==nullptr)
{
QMessageBox::information(this,"提示信息","暂无连接。",QMessageBox::Ok);
}
else
{
socket->disconnectFromHost();//断开连接,如有未接收完的数据,要先接收完
QMessageBox::information(this,"提示信息","已成功断开。",QMessageBox::Ok);
delete socket;//释放内存
socket=nullptr;//置空
}
}
void tcp_server::on_pushButton_2_clicked()//发送数据
{
if(socket==nullptr)
{
QMessageBox::information(this,"提示信息","暂无连接,无法传输数据。",QMessageBox::Ok);
}
else
{
ui->textEdit->append(QString("服务器端:%1").arg(ui->lineEdit->text()));//把记录放在textEdit中
QByteArray S=ui->lineEdit->text().toUtf8();//将QString转化为QByteQrray
socket->write(S);//传输数据
}
}
客户端的搭建:
创建一个TCP_Client项目
1.pro文件添加
QT+=network
ui界面中添加:
2. tcp_client.h文件
#ifndef TCP_CLIENT_H
#define TCP_CLIENT_H
#include <QWidget>
#include<QTcpSocket>
QT_BEGIN_NAMESPACE
namespace Ui { class tcp_client; }
QT_END_NAMESPACE
class tcp_client : public QWidget
{
Q_OBJECT
public:
tcp_client(QWidget *parent = nullptr);
~tcp_client();
private slots:
void on_pushButton_clicked();//连接
void on_pushButton_2_clicked();//断开
void on_pushButton_3_clicked();//发送
private:
Ui::tcp_client *ui;
QTcpSocket *Socket;//套接字
};
#endif // TCP_CLIENT_H
3.tcp_client.cpp文件
#include "tcp_client.h"
#include "ui_tcp_client.h"
#include<QMessageBox>
tcp_client::tcp_client(QWidget *parent)
: QWidget(parent)
, ui(new Ui::tcp_client)
{
ui->setupUi(this);
Socket=new QTcpSocket(this);
connect(Socket,&QTcpSocket::readyRead,[=]()
{
QByteArray bt=Socket->readAll();//读取服务器发送的内容
QString str=bt.data();//转化为QString
ui->textEdit->append(QString("服务器:%1").arg(str));//把内容放在textEdit
});
}
tcp_client::~tcp_client()
{
delete ui;
}
void tcp_client::on_pushButton_clicked()//连接到服务器
{
Socket->abort();//断开已有连接
Socket->connectToHost(ui->lineEdit->text(),ui->lineEdit_2->text().toInt());//连接到服务器
}
void tcp_client::on_pushButton_2_clicked()//断开
{
Socket->disconnectFromHost();//断开连接
QMessageBox::information(this,"提示信息","已断开",QMessageBox::Ok);
}
void tcp_client::on_pushButton_3_clicked()//发送
{
if(Socket->state()==QAbstractSocket::ConnectedState)//如果为连接状态
{
ui->textEdit->append(QString("客户端:%1").arg(ui->lineEdit_3->text()));//把内容添加到textEdit中
QByteArray bta=ui->lineEdit_3->text().toUtf8();
Socket->write(bta);//传输数据
}
else
{
QMessageBox::information(this,"提示信息","未连接,无法发送",QMessageBox::Ok);
}
}
以下为运行过程:
输入主机和端口号然后点击连接,然后点击listen监听
点击yes即可连接
服务器端向客户端发信息:
客户端向服务器端发信息:
点击断开连接,即可断开: