Qt中基于QTcpServer和QTcpSocket的网络通信
在Qt中,基于Tcp套接字通信主要用到QTcpServer和QTcpSocket这两个类:
- QTcpServer:用于服务端,用来监听客户端是否连接。
- QTcpSocket:套接字类,客户端与服务端都需要使用,主要是用于操作数据。
一 .QTcpServer常用到的函数
(1).bool QTcpServer::listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0)
告诉服务端监听的地址和端口,如果地址是QHostAddress::Any,那么服务器将监听所有网路接口,如果端口为0,就会默认选择一个端口;
如果返回为true则为真,否则为假。
(2).void QTcpServer::newConnection()
这是一个信号函数,每次有新的连接时,就会触发此信号。
(3).QTcpSocket *QTcpServer::nextPendingConnection()
将下一个挂起的连接作为已经连接的QTcpSocket套接字对象返回。
二 .QTcpSocket常用到的函数(QTcpSocket继承于QAbstractSocket)
(1).void QAbstractSocket::connected()
当客户端与服务端成功建立连接后,便会触发这个信号。
(2).void QIODevice::readyRead()
每当有新的数据被读取到,就会触发这个信号,比如说服务器向客户端发送数据时,客户端检测到有新数据来了,那边就会触发此信号,然后去处理数据。
(3).void QAbstractSocket::disconnected()
当客户端和服务端断开连接时,就出触发这个信号。
(4).QByteArray QIODevice::readAll()
读取客户端或服务端发送过来的数据,并将其作为字节数组返回,如果返回一个空的QByteArray那么就意味着没有数据读取或者发生了错误。
(5).qint64 QIODevice::write(const char *data)
向客户端或者服务端发送数据,返回值是实际写入的字节数,如果发生了错误,那么返回值为-1;
三.服务端部分代码
QTcpServerDemo::QTcpServerDemo(QWidget *parent) : QWidget(parent),m_pTcpServer(NULL),m_pTcpSocket(NULL) { ui.setupUi(this); QString strTitle = (QString(u8"服务器 端口: %1")).arg(CONNECT_PORT); setWindowTitle(strTitle); //监听套接字 m_pTcpServer = new QTcpServer(this); //指定父对象,让Qt自动回收内存控件 m_pTcpServer->listen(QHostAddress::Any, CONNECT_PORT); connect(m_pTcpServer, &QTcpServer::newConnection, [=]() { QString strDisplay; //取出建立好链接的套接字 m_pTcpSocket = m_pTcpServer->nextPendingConnection(); if (NULL == m_pTcpSocket) { strDisplay = QString(u8"客户端连接失败%3").arg(getCurrentTime()); ui.m_pTextRead->append(strDisplay); return; } //获取对方的IP和端口 QString strIP = m_pTcpSocket->peerAddress().toString(); quint16 nPort = m_pTcpSocket->peerPort(); strDisplay = QString(u8"[%1:%2]:连接成功%3").arg(strIP).arg(nPort).arg(getCurrentTime()); ui.m_pTextRead->append(strDisplay); connect(m_pTcpSocket, &QTcpSocket::readyRead, [=]() { //从通信套接字中取出内容 QByteArray array = m_pTcpSocket->readAll(); QString str = QString("%1 %2").arg(QString(array)).arg(getCurrentTime()); ui.m_pTextRead->append(str); } ); connect(m_pTcpSocket, &QTcpSocket::disconnected, [=]() { QString str =QString(u8"服务端断开连接......%1").arg(getCurrentTime()); ui.m_pTextRead->append(str); } ); } ); }
四.客户端部分代码
QTcpClientDemo::QTcpClientDemo(QWidget *parent) : QWidget(parent),m_pTcpSocket(NULL), m_bConnect(false) { ui.setupUi(this); setWindowTitle(u8"客户端"); //分配对象,指定父对象 m_pTcpSocket = new QTcpSocket(this); if (m_pTcpSocket != NULL) { connect(m_pTcpSocket, &QTcpSocket::connected, [=]() { m_bConnect = true; QString str = QString(u8"成功和服务端建立连接......%1").arg(getCurrentTime()); ui.m_TextRead->append(str); } ); connect(m_pTcpSocket, &QTcpSocket::readyRead, [=]() { //获取对方发送的内容 QByteArray array = m_pTcpSocket->readAll(); QString str = QString("%1 %2").arg(QString(array)).arg(getCurrentTime()); //添加到编辑区中 ui.m_TextRead->append(str); } ); connect(m_pTcpSocket, &QTcpSocket::disconnected, [=]() { m_bConnect = false; QString str = QString(u8"客户端断开连接......%1").arg(getCurrentTime()); ui.m_TextRead->append(str); } ); } }
五.效果展示
分类:
Qt编程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?