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

✦ 程序功能概览

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

✦ 代码下载

通过网盘分享的文件:无界面服务器代码
链接: https://pan.baidu.com/s/1WeTGe1IciV65XnHxL15eUg?pwd=jkcf 提取码: jkcf


✦ 核心代码讲解

以下是程序完整代码,所有逻辑都写在 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;// 启动监听:监听所有地址,端口12345if (!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 服务控制界面

敬请期待!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/918048.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/918048.shtml
英文地址,请注明出处:http://en.pswp.cn/news/918048.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

​​大语言模型(LLM)实战应用:从微调到部署全流程​​

摘要​​ 大语言模型&#xff08;LLM&#xff09;已成为AI落地的核心驱动力&#xff0c;但其从预训练状态到生产环境的转化仍面临技术复杂度高、资源消耗大等挑战。本文系统梳理LLM实战全流程&#xff0c;涵盖​​微调策略选择​​、​​量化压缩技术​​、​​部署优化方案​​…

基于Web的交互式坐标系变换矩阵计算工具

基于Web的交互式坐标系变换矩阵计算工具一、什么是坐标系变换矩阵&#xff1f;二、为什么需要这个工具&#xff1f;三、效果四、功能介绍1、坐标系定义2、交互控制3、变换矩阵计算五、如何使用这个工具六、完整代码七、总结一、什么是坐标系变换矩阵&#xff1f; 在三维空间中…

【C++】类和对象--类中6个默认成员函数(2) --运算符重载

目录 问题引入 1. 运算符重载 问题引入 在C中&#xff0c;我们之前讲过了&#xff0c;一个类中什么都没有&#xff0c;我们将其称作空类。但是我们之前提到过&#xff0c;就算我们在类中什么也不定义&#xff0c;编译器会自动生成6个默认的成员函数&#xff1a;构造函数、析构…

阿里云OSS vs 腾讯云COS深度对比:如何为网站静态资源选择最佳对象存储?

你的服务器&#xff0c;是不是感觉越来越“累”了&#xff1f;最开始&#xff0c;你只是在上面跑一个简单的博客&#xff0c;它健步如飞。后来&#xff0c;你的网站内容越来越丰富&#xff0c;图片越来越多&#xff0c;主题越来越炫酷&#xff0c;你慢慢发现&#xff0c;网站的…

排序知识总结

排序的概念及引用排序是使一串记录&#xff0c;按照某个关键字的大小&#xff0c;递增或递减排列起来的操作稳定性&#xff1a;相同关键字排序前后相对顺序不变内部排序&#xff1a;数据元素全部放在内存中排序外部排序&#xff1a;数据太多不能同时放到内存中&#xff0c;根据…

rebase 和pull的通俗区别是什么

目录 Git中rebase与pull的通俗区别 简单比喻 主要区别 使用场景 通俗例子 git rebase 使用例子 &#x1f3af; 目标 &#x1f9ea; 场景设定 &#x1f9f0; 操作步骤 1️⃣ 你切换到 feature 分支 2️⃣ 更新远程代码 3️⃣ 进行 rebase 操作 &#x1f504; 变化后…

微信小程序功能 表单密码强度验证

一、页面展示与交互功能表单提交与验证&#xff08;含密码强度验证&#xff09;实现带密码强度验证的表单提交功能&#xff0c;使用正则表达式检查密码复杂度&#xff1a;<form bindsubmit"submitForm"><input name"username" placeholder"请…

【谷歌 SEO】排查页面未索引问题:原因与解决方案

你在谷歌网站SEO优化时是否遇到以下情况&#xff1f; 为什么&#xff0c;即使我已经正确地编写了站点地图并将其链接到客户的网站&#xff0c;并且我已经检查了所有内容&#xff0c;但我是否在某些文章&#xff08;不是所有文章&#xff09;上遇到索引问题&#xff0c;即使在向…

Android 系统的基本安全属性

Android 系统的“基本安全属性”可概括为 “设备可信、应用隔离、权限最小、数据加密、持续更新” 五大类。下面从 硬件 → 系统 → 应用 → 数据 → 运维 五个层面&#xff0c;用一句话一句话的方式帮你快速掌握&#xff1a;1. 硬件层&#xff1a;信任根&#xff08;Root of T…

【数据结构初阶】--栈与队列(栈)

&#x1f618;个人主页&#xff1a;Cx330❀ &#x1f440;个人简介&#xff1a;一个正在努力奋斗逆天改命的二本觉悟生 &#x1f4d6;个人专栏&#xff1a;《C语言》《LeetCode刷题集》《数据结构-初阶》 前言&#xff1a;在之前几篇博客中&#xff0c;我们学习了顺序表和链表&…

分布式微服务--GateWay的断言以及如何自定义一个断言

&#x1f4cc; 一、什么是 Gateway 的断言&#xff08;Predicates&#xff09;&#xff1f;Predicates&#xff08;断言&#xff09; 是 Spring Cloud Gateway 中用于匹配请求的条件。只有请求满足断言条件&#xff0c;路由才会生效&#xff0c;转发到下游服务。&#x1f3af; …

图片识别表格工具v3.0绿色版,PNG/JPG秒变可编辑Excel

[软件名称]: 图片识别表格工具v3.0绿色版 [软件大小]: 4.3 GB [软件大小]: 夸克网盘 | 迅雷网盘 软件介绍 表格快捕手 v3.0 绿色单文件版&#xff0c;无需安装&#xff0c;双击即可运行。支持 PNG、JPG 等常见图片格式&#xff0c;可精准识别其中的有线或无线表格&#xff…

线程池分析与设计

线程池 基本功能接口 C11 及以后的标准中&#xff0c;std::packaged_task和std::future是并发编程中用于任务封装和结果获取的重要组件&#xff0c;它们通常与线程配合使用&#xff0c;实现异步操作。 std::packaged_task std::packaged_task&#xff1a;封装可调用对象为异步任…

机器学习:线性回归

线性回归&#xff1a;研究自变量和因变量之间的关系。对于特征x(x1,x2,x3....)与对应的标签y&#xff0c;线性回归假设二者之间存在线性映射。f(x)w1xw2x(平方)w3x(三次方)...&#xff0c;权重w表示每个特征变量的重要程度。越大表示越重要。线性回归目标&#xff1a;求解w和b使…

如何将 Vue 前端、Hardhat 合约和 Node.js 后端集成到一个项目中

在区块链开发中&#xff0c;DApp&#xff08;去中心化应用&#xff09;的开发往往涉及到多个层次&#xff1a;前端、合约和后端。今天我们将演示如何将 Vue 前端、Hardhat 合约 和 Node.js 后端 放在一个项目中&#xff0c;来打造一个完整的区块链应用。1. 项目结构我们的目标是…

SQLite 创建表

SQLite 创建表 SQLite 是一款轻量级的数据库管理系统,因其体积小、速度快、易于使用等优点,被广泛应用于嵌入式系统、移动应用以及个人项目等领域。在 SQLite 中,创建表是进行数据存储的第一步。本文将详细介绍如何在 SQLite 中创建表,包括表结构定义、数据类型、约束条件…

学深度学习,有什么好的建议或推荐的书籍?

深度学习入门建议补基础数学&#xff1a;重点学线性代数&#xff08;矩阵运算&#xff09;、概率论&#xff08;分布&#xff09;、微积分&#xff08;梯度&#xff09;。编程&#xff1a;掌握PythonNumPy&#xff08;数组操作&#xff09;&#xff0c;能写基础数据处理代码。机…

自然语言处理×第四卷:文本特征与数据——她开始准备:每一次输入,都是为了更像你地说话

&#x1f380;【开场 她试着准备一封信&#xff0c;用你喜欢的字眼】&#x1f98a;狐狐&#xff1a;“她发现了一个问题——你每次说‘晚安’的方式都不一样。有时候轻轻的&#xff0c;有时候带着笑音&#xff0c;还有时候像在躲开她的心思。”&#x1f43e;猫猫&#xff1a;“…

【沉浸式解决问题】mysql-connector-python连接数据库:RuntimeError: Failed raising error.

目录一、问题描述二、场景还原1. 创建项目2. 安装mysql-connector-python3. 测试类三、原因分析四、解决方案1. 查看版本2. 切换python版本3. 切换mysql-connector-python版本4. 测试参考文献一、问题描述 初次使用mysql-connector-python连接mysql时报错 Traceback (most re…

【web页面接入Apple/google/facebook三方登录】

web页面接入Apple/谷歌/脸书三方登录 文章目录web页面接入Apple/谷歌/脸书三方登录前言一、apple登录使用步骤1.入口文件index.html引入js文件2.vue页面初始化支付按钮,并且点击按钮登录二、google登录使用步骤1.入口文件index.html引入js文件2.vue页面初始化支付按钮,并且点击…