Qt QTcpServer的使用

本文介绍如何使用Qt创建一个在主线程中运行的简单TCP服务,实现微服务的基本功能。

Qt集成许多小工具类,使开发者使用起来十分便利,QTcpServer就是其中一个,我的目的是要构建一个工作在主线程中,不考虑并发情况下的一个小巧的TCP服务,方便构成一个”微服务“,她满足了我的要求。


创建服务很简单。

     m_server = new QTcpServer(this);

     connect(m_server, SIGNAL(newConnection()), this, SLOT(sendFortune()), Qt::DirectConnection);

     if (!m_server->listen(QHostAddress::Any,8003))
     {
         qDebug() << "Test listen Error!";
         m_server->close();
     }

     this->createInsideProc();

上面的代码中创建了一个服务,当有新socket链接进来时,会触发newConnection信号,激发sendFortune槽执行操作。槽中的代码如下:

     QTcpSocket *clientConnection = m_server->nextPendingConnection();
     connect(clientConnection, SIGNAL(disconnected()), clientConnection, SLOT(deleteLater()));

     clientConnection->waitForReadyRead(-1);
     QByteArray data = clientConnection->readAll();

     qDebug() << data.data() << "\n";

     ....................
     ....................

     clientConnection->disconnectFromHost();

### QTcpServer 使用示例与 TCP 连接处理 `QTcpServer` 是 Qt 提供的一个用于处理传入 TCP 连接的类。它简化了 TCP 服务器的开发流程,允许开发者监听指定端口并处理客户端连接请求。以下是一个完整的示例,展示如何使用 `QTcpServer` 来创建一个简单的 TCP 服务器,并处理客户端连接。 #### 创建 TCP 服务器 首先,需要创建一个继承自 `QTcpServer` 的类,并重写 `incomingConnection()` 方法来处理传入的连接。此外,可以使用 `QTcpSocket` 来管理与客户端的通信。 ```cpp #include <QTcpServer> #include <QTcpSocket> #include <QDebug> class TcpServer : public QTcpServer { Q_OBJECT public: TcpServer(QObject *parent = nullptr) : QTcpServer(parent) {} protected: void incomingConnection(qintptr socketDescriptor) override { QTcpSocket *socket = new QTcpSocket(this); if (!socket->setSocketDescriptor(socketDescriptor)) { delete socket; return; } connect(socket, &QTcpSocket::readyRead, this, [socket]() { QByteArray data = socket->readAll(); qDebug() << "Received data:" << data; // Echo the data back to the client socket->write(data); }); connect(socket, &QTcpSocket::disconnected, socket, &QTcpSocket::deleteLater); } }; ``` #### 启动服务器 在主程序中,创建 `TcpServer` 实例并调用 `listen()` 方法以开始监听指定端口。 ```cpp #include <QCoreApplication> int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); TcpServer server; if (!server.listen(QHostAddress::Any, 8080)) { qDebug() << "Server could not start!"; return -1; } qDebug() << "Server started on port 8080"; return app.exec(); } ``` #### 客户端连接测试 可以使用 `telnet` 或 `nc` (Netcat) 工具来测试服务器是否正常工作。例如,使用 `telnet` 连接到服务器: ```bash telnet 127.0.0.1 8080 ``` 发送一些文本,服务器将回显相同的内容。 #### 处理多个连接 `QTcpServer` 支持同时处理多个客户端连接。每当有新的连接请求时,`incomingConnection()` 方法会被调用,并为每个连接创建一个新的 `QTcpSocket` 实例。通过这种方式,服务器可以同时处理多个客户端的请求。 #### 错误处理 在实际应用中,错误处理是必不可少的。可以通过连接 `QTcpSocket` 的 `errorOccurred` 信号来捕获错误并进行相应的处理。 ```cpp connect(socket, &QTcpSocket::errorOccurred, socket, [socket]() { qDebug() << "Socket error:" << socket->errorString(); }); ``` #### 总结 通过 `QTcpServer` 和 `QTcpSocket`,开发者可以轻松地构建一个功能完善的 TCP 服务器。上述示例展示了如何创建服务器、处理传入连接、读取和发送数据,并进行了基本的错误处理。这一框架为网络通信提供了良好的抽象,使得开发者能够专注于业务逻辑的实现[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wolfseek

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值