QT的TCP通信
今天简单学习了一下Qt中的TCP通信,实现了一个简单的对话框。
首先贴一下TCP的概念
TCP是一种面向连接的传输层控制协议,可靠的,基于字节流的传输协议,由IETF的RFC 793定义。和UDP最大的区别是需要连接的,三次握手四次挥手,校验机制保证了数据传输的稳定性和可靠性,在接收过程中定期的回送他自己的一个状态给客户端,客户端也会根据这样的状态进行这样的速度调整,以便自己客户端的速度适应服务端的额速度。
接下来是编程部分
QT提供了QTcpSocket类,我们基于它来实现程序。在QT中进行网络编程,首先要在.pro文件里添加network。也就是
QT += network
客户端部分
1、我们在ClientWidget类里定义一个私有成员
QTcpSocket* tcpsocket = nullptr;
2、接着在构造函数里实例化
tcpsocket = new QTcpSocket(this);
3、请求连接与断开连接
//请求连接
connect(ui -> ButtonConnect,&QPushButton::clicked,[=]()
{
tcpsocket -> connectToHost(ui->lineEditIP->text(),ui->lineEditPort->text().toInt());
});
//关注是否连上了服务器
connect(tcpsocket,&QTcpSocket::connected,[=]()
{
ui->textEditRead->append("成功连上了服务器!");
});
4、发送数据、接收数据
//发送数据
connect(ui->ButtonSend,&QPushButton::clicked,[=]()
{
//首先获取文本框的数据
QString data = ui->textEditWrite->toPlainText();
tcpsocket->write(data.toStdString().data());
ui->textEditWrite->clear();
});
//接收数据
connect(tcpsocket,&QTcpSocket::readyRead,[=]()
{
QByteArray data = tcpsocket->readAll();
ui->textEditRead->append(data.toStdString().data());
});
服务端部分
1、我们首先在ServerWidget类里定义两个私有成员
QTcpServer* tcpserver = nullptr;
QTcpSocket* tcpsocket = nullptr;
2、监听
//构造监听套接字
tcpserver = new QTcpServer(this);
//监听
tcpserver -> listen(QHostAddress::Any,8888);
3、关注有无新信号
建立连接后在槽函数内处理接收到的数据
//关注有无新连接的信号
connect(tcpserver,&QTcpServer::newConnection,[=]()
{
//取出建立好连接的套接字
tcpsocket = tcpserver -> nextPendingConnection();
//获取客户端的信息,ip,port
QString ip = tcpsocket -> peerAddress().toString();
qint64 port = tcpsocket -> peerPort();
QString temp = QString("客户端成功连接到服务端 ip:%1,port,%2").arg(ip).arg(port);
//连接成功后显示成功信息
ui -> textEditRead -> append(temp);
//处理接收的数据
connect(tcpsocket,&QTcpSocket::readyRead,[=]()
{
//处理数据
if(tcpsocket != nullptr)
{
QByteArray data = tcpsocket ->readAll();
ui -> textEditRead -> append(data);
}
});
});
4、向客户端发送数据
connect(ui->ButtonSend,&QPushButton::clicked,[=]()
{
//发送数据给客户端
QString data = ui ->textEditWrite->toPlainText();
if(tcpsocket != nullptr)
{
tcpsocket->write(data.toStdString().data());
//data.toStdString().data() data从qstring转到了char*
}
ui->textEditWrite->clear();
});
实现的效果如下图
程序主体到这里就结束了,大家有什么问题以及宝贵建议可以在评论区提出。
希望与大家共同学习成长!