QT自带了TCP通信模块,只需在工程文件中加入QT += network,就可以添加TCP所需的头文件,下面就来实现通过TCP协议让服务器和客户端之间行通信。
一、服务器的实现
服务器端 QTcpServer+QTcpSocket
QTcpServer(创建socket套接字, 绑定, 监听, 接受链接)
QTcpSocket(创建socket套接字--链接时候创建, 接收数据, 发送数据)
实现流程
1. 创建QTcpServer对象
QTcpServer mserver;
2. 调用对象方法监听(listen(ip, port))
mserver.listen(QHostAddress::Any, ui->portEdit->text().toUShort());
3.当有客户端连接的时候QTcpServer对象会发送newConnection信号--关联槽函数
connect(&mserver, &QTcpServer::newConnection, this, &ServerTcp::new_client);
4.在槽函数中通过QTcpServer对象获取QTcpSocket对象,并给客户端发送连接成功的消息
void ServerTcp::new_client()
{
QTcpSocket *msocket = mserver.nextPendingConnection();//获取与客户端通信的套接字
//向客户端发送数据
msocket->write("connect");
}
5.当客户端有数据到达服务器QTcpSocket对象会发送readyRead信号--关联槽函数
connect(msocket, &QTcpSocket::readyRead, this, &ServerTcp::read_data);
6.在槽函数中通过QTcpSocket对象读取数据
void ServerTcp::read_data()
{
//获取信号发送者
QTcpSocket *msocket = dynamic_cast<QTcpSocket*>(sender());
//读取数据
QString msg = msocket->readAll();
//获取对方IP
QString ip = msocket->peerAddress().toString();
ui->textBrowser->append(ip+":"+msg);
}
二、客户端的实现
客户端 QTcpSocket
QTcpSocket(创建socket套接字,连接服务器, 接收数据, 发送数据)
实现流程
1. 创建QTcpSocket对象
QTcpSocket msocket;
2. 调用对象方法链接服务器(connectToHost(服务器的IP, 端口))
msocket.connectToHost(ui->ipEdit->text(), ui->portEdit->text().toUShort());
3. 发送数据
QString data = ui->textEdit->toPlainText();
msocket.write(data.toUtf8());
4. 当QTcpSocket有数据可读会发送readyRead信号--关联槽函数
connect(&msocket, &QTcpSocket::readyRead, this, &ClientTcp::read_data);
5. 在槽函数中读取数据
void ClientTcp::read_data()
{
//读取数据
QString msg = msocket.readAll();
ui->textBrowser->append(msg);
}
三、具体代码
服务器
1、界面设计
2、代码设计
#include "servertcp.h"
#include "ui_servertcp.h"
ServerTcp::ServerTcp(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::ServerTcp)
{
ui->setupUi(this);
//关联客户端连接信号
connect(&mserver, &QTcpServer::newConnection, this, &ServerTcp::new_client);
}
ServerTcp::~ServerTcp()
{
delete ui;
}
void ServerTcp::on_startBt_clicked()
{
//监听--启动服务器
mserver.listen(QHostAddress::Any, ui->portEdit->text().toUShort());
}
//槽函数---接受链接--获取与客户端通信的套接字
void ServerTcp::new_client()
{
QTcpSocket *msocket = mserver.nextPendingConnection();//获取与客户端通信的套接字
//向客户端发送数据
msocket->write("connect");
//关联读数据信号
connect(msocket, &QTcpSocket::readyRead, this, &ServerTcp::read_data);
}
//槽函数---读取数据
void ServerTcp::read_data()
{
//获取信号发送者
QTcpSocket *msocket = dynamic_cast<QTcpSocket*>(sender());
//读取数据
QString msg = msocket->readAll();
//获取对方IP
QString ip = msocket->peerAddress().toString();
ip.remove("::ffff:");
ui->textBrowser->append(ip+":"+msg);
}
客户端
1、界面设计
2、代码设计
#include "clienttcp.h"
#include "ui_clienttcp.h"
ClientTcp::ClientTcp(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::ClientTcp)
{
ui->setupUi(this);
//关联读数据信号
connect(&msocket, &QTcpSocket::readyRead, this, &ClientTcp::read_data);
}
ClientTcp::~ClientTcp()
{
delete ui;
}
void ClientTcp::on_connectBt_clicked()
{
//链接服务器
msocket.connectToHost(ui->ipEdit->text(), ui->portEdit->text().toUShort());
}
void ClientTcp::on_sendBt_clicked()
{
//发送数据
QString data = ui->textEdit->toPlainText();
msocket.write(data.toUtf8());
}
void ClientTcp::read_data()
{
//读取数据
QString msg = msocket.readAll();
ui->textBrowser->append(msg);
}