一、TCP的特点
TCP(传输控制协议)是一种面向连接的,可靠的,基于字节流的传输层通信协议
二、TCP适合应用的场景
TCP协议适用于要求可靠传输的应用,例如文件传输,网络数据库,分布式高精度计算系统的数据传输。
三、Qt中使用TCP通信
Qt中的TCP通信与之前所讲的UDP通信有着明显区别,使用TCP通信,就有着明确的客户端与服务器之分,服务器有两个套接字,分别是一个用于通信的通信套接字(QTcpSocket),一个是用于监听的监听套接字(QTcpServer),客户端只有一个用于通信的通信套接字(QTcpSocket),基本流程是客户端首先得向服务器发送连接请求,服务器监听到有客户端向它发送连接请求时,会触发newConnection信号,与此同时,客户端会触发connected信号,表示与服务器成功连接,两者建立好连接之后,服务器需要返回一个通信套接字用于和客户端通信,随后客户端与服务器就可以通过通信套接字来进行数据之间的通信
四、客户端与服务器通信的实现
添加网络模块
QT += network;
添加头文件
#include //通信套接字#include //监听套接字
服务器端的实现
tcpserver分配空间,指定父对象,然后开始监听
tcpserver = new QTcpServer(this); //分配空间,指定父对象tcpserver->listen(QHostAddress::Any,8888);//监听本机所有网口及8888端口号
一旦监听到有客户端发起了连接请求,服务器端触发newConnection信号,与此同时,客户端会触发connected信号,服务器返回一个建立好连接的通信套接字,当客户端发送数据时,服务器端会触发readyRead信号,取出tcpsocket中的数据,显示到窗口中,实现接收数据
客户端返回一个建立好连接的通信套接字一般使用如下函数
tcpsocket = tcpserver->nextPendingConnection();
完整代码
connect(tcpserver,&QTcpServer::newConnection,[=] //Server监听到连接请求触发newConnection信号 { tcpsocket = tcpserver->nextPendingConnection();//Client与Server建立连接后,Server返回一个建立好连接用于通信的套接字 QString ip = tcpsocket->peerAddress().toString();//获取对方的IP qint16 port = tcpsocket->peerPort();//获取对方的端口 QString time= QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");//获取当前时间 ui->te_output->append(time+"\n"+QString("成功与[%1:%2]建立连接...").arg(ip).arg(port)); connect(tcpsocket,&QTcpSocket::readyRead,[=] //接收数据 { QString message = tcpsocket->readAll(); QString time= QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"); ui->te_output->append(time + "\n"+message); }); });
发送数据,使用write()函数,因为已经建立好了连接,所以参数可以只有一个,就是你想发送的数据
//获取用户输入的信息 QString text = ui->te_input->toPlainText(); tcpsocket->write(text.toUtf8().data());
断开连接,使用disconnectFromHost();
tcpsocket->disconnectFromHost();//主动和客户端断开连接tcpsocket->close();tcpsocket = NULL;
客户端的实现
客户端向服务器发送连接请求
第一个参数是服务器的IP地址,第二个参数是服务器的端口号
tcpsocket->connectToHost(QHostAddress(peerip),peerport);
客户端成功连接服务器,触发connected信号,触发相应槽函数
connect(tcpsocket,&QTcpSocket::connected,[=] //客户端成功建立连接后触发connected信号 { QString str = QString("成功与[%1:%2]建立连接...").arg(peerip).arg(peerport); QString time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"); ui->te_output->append(time+"\n"+str); });
客户端的发送与接收数据与服务器端是相同的,就不再过多阐述了
发送数据
//获取用户输入的信息QString text = ui->te_input->toPlainText();tcpsocket->write(text.toUtf8().data());
接收数据
connect(tcpsocket,&QTcpSocket::readyRead,[=] { QString message = tcpsocket->readAll(); QString time= QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"); QString name = tcpsocket->peerName(); ui->te_output->append(time + "\n"+name+":"+message); });
断开连接时tcpsocket会触发disconnected信号
connect(tcpsocket,&QTcpSocket::disconnected,[=] { QString time= QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"); ui->te_output->append(time + "\n"+"与服务器断开连接..."); });
程序演示
建立连接
互相发送数据
断开连接
客户端与服务器端都可以主动与对方断开连接,断开连接后,双方就不能进行通信了
我是龙木南,这篇文章对你有帮助的话~就点个赞把~
点赞关注收藏就是对我最大的支持~
来源地址:https://blog.csdn.net/m0_71741835/article/details/127613418