【QT】TCP服务端网络通信
第一步:.pro工程文件添加
QT += network
第二步:.h文件添加
#ifndef TCPSERVER_H
#define TCPSERVER_H
#include <QException>
#include <QDebug>
#include <QTcpServer>
#include <QTcpSocket>
class TcpServer: public QObject
{
Q_OBJECT
public:
TcpServer();
bool openNetWork(qint16 port);
void closeNetWork();
bool getNetWorkStatus();
void sendData(QString msg);
private:
void connection();
void disConnected(QTcpSocket tcp);
private:
QTcpServer *m_s = nullptr;
QTcpSocket *m_tcp = nullptr;
signals:
//信号没有返回值,可以有参数,信号函数不需要定义,只需要声明
void pushNetwork_singal(QByteArray buffer, qint64 length);
};
#endif // TCPSERVER_H
第三步:.cpp文件添加
#include "tcpserver.h"
TcpServer::TcpServer()
{
}
// 开启网络监听
bool TcpServer::openNetWork(qint16 port)
{
try {
closeNetWork();
// 创建监听的套接字
m_s = new QTcpServer(this);
// 信号/槽绑定监听客户端接入
connect(m_s, &QTcpServer::newConnection, this, &TcpServer::connection, Qt::QueuedConnection);
// 开启监听
m_s->listen(QHostAddress::Any, port);
return m_s->isListening();
} catch (std::exception ex) {
qDebug() << "打开网络监听失败:" << ex.what();
}
return false;
}
// 关闭网络监听
void TcpServer::closeNetWork()
{
if(m_tcp != NULL && m_tcp->isOpen()) {
m_tcp->close();
m_tcp->deleteLater();
m_tcp = nullptr;
}
if(m_s != NULL && m_s->isListening()) {
m_s->close();
m_s->deleteLater();
m_s = nullptr;
}
}
// 获取网络状态
bool TcpServer::getNetWorkStatus()
{
return m_s->isListening();
}
// 客户端接入
void TcpServer::connection()
{
try {
qDebug() << "客户端接入";
// 创建用于通信的套接字
m_tcp = m_s->nextPendingConnection();
// 检测是否可以接受数据
connect(m_tcp, &QTcpSocket::readyRead, this, [ = ]() {
try {
QByteArray data = m_tcp->readAll();
pushNetwork_singal(data, data.count());
} catch (std::exception ex) {
qDebug() << "读取数据失败:" << ex.what();
}
});
// 断开连接
connect(m_tcp, &QTcpSocket::disconnected, this, [ = ]() {
try {
qDebug() << "客户端断开";
m_tcp->close();
m_tcp->deleteLater();
m_tcp = nullptr;
} catch (std::exception ex) {
qDebug() << "客户端连接断开处理失败:" << ex.what();
}
});
} catch (std::exception ex) {
qDebug() << "客户端接入失败:" << ex.what();
}
}
// 发送数据
void TcpServer::sendData(QString msg)
{
if(m_tcp != nullptr && m_tcp->isOpen()) {
// (msg.toUtf8();//转换成utf8格式的字节流发送
// 按十六进制编码发送
QByteArray byte = QByteArray::fromHex (msg.toLatin1().data());//按十六进制编码发送
m_tcp->write(byte);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义