本篇将讲解如何使用 Qt 构建一个简单但完整的TCP 服务端,无需图形界面。
unsetunset
unsetunset✦ 程序功能概览unsetunset
-
启动一个监听本地 12345
端口的 TCP 服务; -
有客户端连接时输出信息; -
每秒向客户端发送一次当前时间; -
支持接收客户端数据; -
客户端断开时输出断开提示。
unsetunset✦ 代码下载unsetunset
通过网盘分享的文件:无界面服务器代码 链接: https://pan.baidu.com/s/1WeTGe1IciV65XnHxL15eUg?pwd=jkcf 提取码: jkcf
unsetunset✦ 核心代码讲解unsetunset
以下是程序完整代码,所有逻辑都写在 main()
函数中,便于入门学习。
#include <QCoreApplication>
#include <QTcpServer>
#include <QTcpSocket>
#include <QDateTime>
#include <QTextStream>
#include <QTimer>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
QTcpServer server;
// 启动监听:监听所有地址,端口12345
if (!server.listen(QHostAddress::Any, 12345)) {
qCritical() << "服务器启动失败:" << server.errorString();
return1;
}
qDebug() << "服务器已启动,监听端口:" << server.serverPort();
// 处理新连接
QObject::connect(&server, &QTcpServer::newConnection, [&server]() {
while (server.hasPendingConnections()) {
QTcpSocket *socket = server.nextPendingConnection();
// 输出客户端连接信息
QString clientIP = socket->peerAddress().toString();
quint16 clientPort = socket->peerPort();
qDebug() << "机械臂连接:" << clientIP << ":" << clientPort;
// 初次发送时间
QTextStream ts(socket);
ts << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss") << "\n";
ts.flush();
// 定时器:每秒发送一次时间
QTimer *timer = new QTimer(socket);
timer->setInterval(1000);
QObject::connect(timer, &QTimer::timeout, [socket]() {
if (socket->state() == QAbstractSocket::ConnectedState) {
QTextStream ts(socket);
ts << QDateTime::currentDateTime().toString("hh:mm:ss") << "\n";
ts.flush();
}
});
timer->start();
// 处理接收到的数据
QObject::connect(socket, &QTcpSocket::readyRead, [socket]() {
QByteArray data = socket->readAll();
qDebug() << "收到客户端数据:" << QString::fromUtf8(data).trimmed();
});
// 错误处理
QObject::connect(socket, QOverload<QAbstractSocket::SocketError>::of(&QTcpSocket::errorOccurred),
[socket](QAbstractSocket::SocketError) {
qWarning() << "连接错误:" << socket->errorString();
});
// 客户端断开连接
QObject::connect(socket, &QTcpSocket::disconnected, [socket, clientPort]() {
qDebug() << "客户端端口" << clientPort << "断开连接";
socket->deleteLater();
});
}
});
return app.exec();
}
unsetunset✦ 函数功能一览unsetunset
|
|
---|---|
QTcpServer::listen() |
|
server.newConnection |
|
nextPendingConnection() |
|
peerAddress()
peerPort() |
|
QTextStream |
|
QTimer::timeout |
|
readyRead |
|
errorOccurred |
|
disconnected |
|
unsetunset📌 总结unsetunset
本篇实现了一个精简、高效的 TCP 服务端:
-
构建方式简单; -
支持定时数据推送; -
适合做嵌入式或控制终端后台服务。
unsetunset📢 下一篇预告:unsetunset
使用 QWidget 构建 TCP 服务控制界面
敬请期待!