QT:Telnet客户端与服务器的创建

  • 客户端
  1. telnetClient类
#ifndef TELNETCLIENT_H
#define TELNETCLIENT_H#include <QObject>
#include <QTcpSocket>class TelnetClient : public QObject
{Q_OBJECTpublic:explicit TelnetClient(QObject *parent = nullptr);~TelnetClient();// 连接到指定的主机和端口bool connectToHost(const QString &hostname, quint16 port);// 发送数据到服务器void sendData(const QByteArray &data);signals:// 连接成功void connected();// 连接断开void disconnected();// 收到数据void readyRead(const QByteArray &data);// 发生错误void errorOccurred(const QString &errorString);private slots:// 处理服务器发送的数据void onReadyRead();// 处理连接错误void onError(QAbstractSocket::SocketError socketError);private:QTcpSocket *tcpSocket;
};#endif // TELNETCLIENT_H
#include "telnetclient.h"
#include <QDebug>TelnetClient::TelnetClient(QObject *parent) :QObject(parent),tcpSocket(new QTcpSocket(this))
{connect(tcpSocket, &QTcpSocket::readyRead, this, &TelnetClient::onReadyRead);connect(tcpSocket, QOverload<QAbstractSocket::SocketError>::of(&QAbstractSocket::errorOccurred),this, &TelnetClient::onError);connect(tcpSocket, &QTcpSocket::connected, [this]() {emit connected();});connect(tcpSocket, &QTcpSocket::disconnected, [this]() {emit disconnected();});
}TelnetClient::~TelnetClient()
{
}bool TelnetClient::connectToHost(const QString &hostname, quint16 port)
{tcpSocket->connectToHost(hostname, port);return tcpSocket->waitForConnected(3000); // 等待3秒以建立连接
}void TelnetClient::sendData(const QByteArray &data)
{if (tcpSocket->state() == QAbstractSocket::ConnectedState) {tcpSocket->write(data);tcpSocket->flush();}
}void TelnetClient::onReadyRead()
{QByteArray data = tcpSocket->readAll();emit readyRead(data);
}void TelnetClient::onError(QAbstractSocket::SocketError socketError)
{Q_UNUSED(socketError);emit errorOccurred(tcpSocket->errorString());
}
  1. 应用

主程序

#include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}
  • 窗口类
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>#include "telnetclient.h"QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void onConnectButtonClicked();void onTelnetReadyRead(const QByteArray &data);void onTelnetError(const QString &errorString);void onTelnetConnected();void onTelnetDisconnected();private:Ui::MainWindow *ui;TelnetClient *telnetClient;};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow),telnetClient(new TelnetClient(this))
{ui->setupUi(this);connect(ui->connectButton, &QPushButton::clicked, this, &MainWindow::onConnectButtonClicked);connect(telnetClient, &TelnetClient::readyRead, this, &MainWindow::onTelnetReadyRead);connect(telnetClient, &TelnetClient::errorOccurred, this, &MainWindow::onTelnetError);connect(telnetClient, &TelnetClient::connected, this, &MainWindow::onTelnetConnected);connect(telnetClient, &TelnetClient::disconnected, this, &MainWindow::onTelnetDisconnected);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::onConnectButtonClicked()
{QString hostname = ui->hostLineEdit->text();quint16 port = ui->portLineEdit->text().toUInt();if (!telnetClient->connectToHost(hostname, port)) {ui->textEdit->append("Connection failed.");}
}void MainWindow::onTelnetReadyRead(const QByteArray &data)
{ui->textEdit->append(data);
}void MainWindow::onTelnetError(const QString &errorString)
{ui->textEdit->append("Error: " + errorString);
}void MainWindow::onTelnetConnected()
{ui->textEdit->append("Connected to server.");
}void MainWindow::onTelnetDisconnected()
{ui->textEdit->append("Disconnected from server.");
}

  • 服务器
  1. telnetServer类
#ifndef TELNETSERVER_H
#define TELNETSERVER_H#include <QObject>
#include <QTcpServer>
#include <QTcpSocket>class TelnetServer : public QObject
{Q_OBJECTpublic:explicit TelnetServer(QObject *parent = nullptr);~TelnetServer();// 启动服务器,监听指定端口bool start(quint16 port);signals:// 当有新的客户端连接时void newConnection();private slots:// 处理新客户端的连接void onNewConnection();// 处理客户端发送的数据void onReadyRead();// 处理客户端断开连接void onClientDisconnected();private:QTcpServer *tcpServer;QList<QTcpSocket*> clients;
};#endif // TELNETSERVER_H
#include "telnetserver.h"
#include <QDebug>TelnetServer::TelnetServer(QObject *parent) :QObject(parent),tcpServer(new QTcpServer(this))
{connect(tcpServer, &QTcpServer::newConnection, this, &TelnetServer::onNewConnection);
}TelnetServer::~TelnetServer()
{// 清理客户端连接for (QTcpSocket *client : clients) {client->disconnectFromHost();client->deleteLater();}clients.clear();
}bool TelnetServer::start(quint16 port)
{if (!tcpServer->listen(QHostAddress::Any, port)) {qDebug() << "Server could not start!";return false;}qDebug() << "Server started on port" << port;return true;
}void TelnetServer::onNewConnection()
{QTcpSocket *clientSocket = tcpServer->nextPendingConnection();clients.append(clientSocket);connect(clientSocket, &QTcpSocket::readyRead, this, &TelnetServer::onReadyRead);connect(clientSocket, &QTcpSocket::disconnected, this, &TelnetServer::onClientDisconnected);qDebug() << "New client connected!";emit newConnection();
}void TelnetServer::onReadyRead()
{QTcpSocket *clientSocket = qobject_cast<QTcpSocket*>(sender());if (!clientSocket)return;QByteArray data = clientSocket->readAll();qDebug() << "Received data:" << data;// Echo the data back to the clientclientSocket->write(data);
}void TelnetServer::onClientDisconnected()
{QTcpSocket *clientSocket = qobject_cast<QTcpSocket*>(sender());if (!clientSocket)return;clients.removeAll(clientSocket);clientSocket->deleteLater();qDebug() << "Client disconnected.";
}
  1. 应用
#include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include "telnetserver.h"QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void onStartButtonClicked();void onNewConnection();private:Ui::MainWindow *ui;TelnetServer *telnetServer;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow),telnetServer(new TelnetServer(this))
{ui->setupUi(this);connect(ui->startButton, &QPushButton::clicked, this, &MainWindow::onStartButtonClicked);connect(telnetServer, &TelnetServer::newConnection, this, &MainWindow::onNewConnection);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::onStartButtonClicked()
{quint16 port = ui->portLineEdit->text().toUInt();if (telnetServer->start(port)) {ui->statusLabel->setText("Server started on port " + QString::number(port));} else {ui->statusLabel->setText("Failed to start server.");}
}void MainWindow::onNewConnection()
{ui->statusLabel->setText("New client connected.");
}

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

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

相关文章

启发式算法之模拟退火算法

文章目录 1. 模拟退火算法概述1.1 算法起源与发展1.2 算法基本原理 2. 算法实现步骤2.1 初始化过程2.2 迭代与降温策略 3. 模拟退火算法的优化策略3.1 冷却进度表的设计3.2 参数调整与策略 4. 模拟退火算法的应用领域4.1 组合优化问题4.1.1 旅行商问题&#xff08;TSP&#xff…

YOLO好像也没那么难?

“学YOLO的念头是想整个游戏外挂&#xff01;” 目录 基本原理 模型推理 IOU交并比 NMS非极大值抑制 模型训练 损失函数LOSS 代码实现 YOLO学习渠道 基本原理 模型推理 学习一个新的神经网络结构&#xff0c;作者认为整明白输入和输出是怎么回事就OK了&#xff0c;至于…

HTML静态网页成品作业(HTML+CSS)——安徽宣笔设计制作(5个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有6个页面。 二、作品演示 三、代…

回调函数,字符函数,字符串函数

前言&#xff1a;上一趴我们学习了指针。那么今天我们来学习新的知识&#xff0c;回调函数&#xff0c;字符函数&#xff0c;字符串函数。 1 回调函数 什么是回调函数呢&#xff1f;回调函数就是通过函数指针调用的函数。 如果你把函数的指针&#xff08;地址&#xff09;作…

【Docker系列】Docker 容器时区设置指南

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

尚硅谷MYSQL(5-6章)

排序和分页 排序 如果没有使用排序操作的话 查询出来的数据是按添加的顺序排序的 ORDER BY是来进行排序的 后面可以添加ASC升序 DESC降序 如果后面没有显示指明排序的方式的话 则默认按照升序排序 where中不能使用列的别名 我们在使用sql语句的时候 她的执行顺序不是从第一…

FastCopy文件快速复制v5.7.15

软件介绍 FastCopy文件快速复制工具。Windows平台上最快的文件复制、删除软件&#xff01;功能强劲&#xff0c;性能优越&#xff01;它是源于日本的高效文件复制加速软件&#xff0c;支持拖拽操作&#xff0c;三种不同HDD模式&#xff1b;支持通配符&#xff0c;任务管理/命令…

微信小程序保存图片到相册

申请权限 代码如下 wx.downloadFile({url: image, //仅为示例&#xff0c;并非真实的资源success(res) {// 只要服务器有响应数据&#xff0c;就会把响应内容写入文件并进入 success 回调&#xff0c;业务需要自行判断是否下载到了想要的内容if (res.statusCode 200) {consol…

XSS Game练习

1.Ma Spaghet 直接get传参 ?somebodyaaaa直接使用img标签 ?somebody<img%20src1%20onerror"alert(1337)">官方文档 应使用innertext&#xff0c;安全性更高 2.Jefff 通过代码可以知道是通过eval的代码执行&#xff0c;setTimeout中的内容表示在一秒后执行…

uniapp预览图片uni.previewImage图片放大

<image v-if"file.image!" :src"file.image" click"previewImage(file.image)"></image>file: {image: ,status: 1}, // 预览 图片previewImage() {uni.previewImage({current: 1,urls: [this.img] // 是个 数组 单张的&#xff08…

JAVA打车小程序APP打车顺风车滴滴车跑腿源码微信小程序打车系统源码

&#x1f697;&#x1f4a8;打车、顺风车、滴滴车&跑腿系统&#xff0c;一键解决出行生活难题&#xff01; 一、出行新选择&#xff0c;打车从此不再难 忙碌的生活节奏&#xff0c;让我们常常需要快速、便捷的出行方式。打车、顺风车、滴滴车系统&#xff0c;正是为了满足…

[C#]winform基于opencvsharp结合Diffusion-Low-Light算法实现低光图像增强黑暗图片变亮变清晰

【训练源码】 https://github.com/JianghaiSCU/Diffusion-Low-Light 【参考源码】 https://github.com/hpc203/Diffusion-Low-Light-onnxrun 【论文地址】 https://arxiv.org/pdf/2306.00306.pdf 【算法原理图】 【效果展示】 【测试环境】 vs2019 netframework4.7.2 …

ffmpeg采用gpu加速增加水印

1.环境需要 系统 windows10 ffmpeg&#xff0c;ffprobe 字体文件 python3以上版本 2.环境配置 从官网上下载ffmpeg版本https://github.com/BtbN/FFmpeg-Builds/releases&#xff0c;这里我用的是这个&#xff0c;解压之后里面包含ffmpeg&#xff0c;ffprobe&#xff0c;f…

【uniapp】vue3+vite配置tailwindcss

安装 npm install autoprefixer tailwindcss uni-helper/vite-plugin-uni-tailwind -Dautoprefixer &#xff1a;自动管理浏览器前缀的插件&#xff0c;可以解析css文件并且添加前缀到css内容里。uni-helper/vite-plugin-uni-tailwind: 将 Tailwind CSS 框架集成到使用 Vite 作…

Cesium天空盒子(Skybox)制作(js代码)和显示

介绍 在Cesium中&#xff0c;星空背景是通过天空盒子方式&#xff08;6张图片&#xff09;来显示的&#xff0c;原生的图片分辨率太低&#xff0c;本项目用于生成天空盒子的6张图片。最终生成的6个图片大小约为500kb(每个)&#xff0c;格式为jpg&#xff0c;总共的恒星数目约为…

最新保姆级Anaconda和Pycharm安装激活过程(2024最新版本)

Anaconda和Pycharm安装过程 Anaconda安装过程第一步第二步第三步第四步第五步第六步第七步第八步第九步Pycharm 安装过程&#xff1a;第一步第二步第三步第四步第五步第六步---激活过程第七步第八步第九步第十步第十一步第十二步第十三步第十四步Anaconda和Pycharm软件百度网盘…

Video视频抽帧和WebCodecs API视频抽帧介绍

目录 mp4Box抽帧 ffmpeg抽帧 video元素抽帧 WebCodecs 核心API 视频文件是一个容器&#xff0c;里面有很多不同的轨道信息。如&#xff1a;图像、声音、字幕等。而视频图像信息又是由一系列图片序列帧的集合。如10秒时长的视频&#xff0c;假设每秒30帧。那大概有300条图像…

大公报发表欧科云链署名文章:发行港元稳定币,建Web3.0新生态

欧科云链研究院资深研究员蒋照生近日与香港科技大学副校长兼香港Web3.0协会首席科学顾问汪扬、零壹智库创始人兼CEO柏亮&#xff0c;在大公报发布联合署名文章 ——《Web3.0洞察 / 发行港元稳定币&#xff0c;建Web3.0新生态》&#xff0c;引发市场广泛讨论。 文章就香港稳定币…

2024年【汽车驾驶员(技师)】考试报名及汽车驾驶员(技师)试题及解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 汽车驾驶员&#xff08;技师&#xff09;考试报名参考答案及汽车驾驶员&#xff08;技师&#xff09;考试试题解析是安全生产模拟考试一点通题库老师及汽车驾驶员&#xff08;技师&#xff09;操作证已考过的学员汇总…

【二分查找】--- 初阶题目赏析

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; 算法Joureny 上篇我们讲解了关于二分的朴素模板和边界模板&#xff0c;本篇博客我们试着运用这些模板。 &#x1f3e0; 搜索插入位置 &#x1f4cc; 题目…