手动开发一个TCP服务器调试工具(二):无界面 TCP 通信服最小实现

本篇将讲解如何使用 Qt 构建一个简单但完整的TCP 服务端 ,无需图形界面。

✦ 程序功能概览

  • 启动一个监听本地 12345 端口的 TCP 服务;
  • 有客户端连接时输出信息;
  • 每秒向客户端发送一次当前时间;
  • 支持接收客户端数据;
  • 客户端断开时输出断开提示。

✦ 代码下载

通过网盘分享的文件:无界面服务器代码

链接: https://pan.baidu.com/s/1WeTGe1IciV65XnHxL15eUg?pwd=jkcf 提取码: jkcf


✦ 核心代码讲解

以下是程序完整代码,所有逻辑都写在 main() 函数中,便于入门学习。

cpp 复制代码
#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();
        return 1;
    }

    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();
}

✦ 函数功能一览

函数 / 方法 功能说明
QTcpServer::listen() 启动监听,接收客户端连接
server.newConnection 有新连接时发出信号
nextPendingConnection() 获取当前连接的客户端套接字
peerAddress() / peerPort() 获取客户端的 IP 和端口
QTextStream 以流方式发送文本,简化编码处理
QTimer::timeout 每秒触发,发送时间数据
readyRead 客户端发送数据时触发
errorOccurred 套接字错误处理
disconnected 客户端断开连接时释放资源

📌 总结

本篇实现了一个精简、高效的 TCP 服务端:

  • 构建方式简单;
  • 支持定时数据推送;
  • 适合做嵌入式或控制终端后台服务。

📢 下一篇预告:

使用 QWidget 构建 TCP 服务控制界面

敬请期待!


相关推荐
想做小南娘,发现自己是女生喵1 分钟前
LAN Device Monitor 第二周学习文档
java·服务器·数据库
jaysee-sjc18 分钟前
【苍穹外卖】Day10:定时任务与 WebSocket 实时提醒实战
java·开发语言·javascript·数据库·vue.js·websocket·网络协议
叼烟扛炮25 分钟前
Linux 学习笔记(三十二):线程控制——创建、等待与分离
linux·运维·服务器·笔记·学习·1024程序员节
xbzb37 分钟前
服务器形态怎么选、BIOS 怎么进?从 1U 机架到固件启动项一次讲透
运维·服务器·bios·启动·固件·启动项
夜雪一千43 分钟前
Linux 权限、用户、用户组内容介绍
linux·运维·服务器
未来之窗软件服务1 小时前
诡异的网络IP/域名/ICMP通应用层失败骨干网分层拦截分析-东方仙盟
网络·tcp/ip·智能路由器·dns劫持·仙盟创梦ide·东方仙盟
叼烟扛炮2 小时前
Linux 学习笔记(三十一):线程概念、底层分页机制与初体验
linux·运维·服务器·笔记·学习·1024程序员节
星恒随风2 小时前
Linux Socket UDP编程(一):手写UDP回显服务器与客户端,从socket、bind、recvfrom到网络字典服务器完整实战
linux·服务器·网络·笔记
H.莓飛2 小时前
【数据结构】归并与外排序
linux·服务器·c语言·开发语言·数据结构·visual studio
幻智星科技2 小时前
我砍掉了FPGA里的ARM核项目反而提前交付了
arm开发·网络协议·fpga开发·硬件架构