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

news2024/11/27 10:37:41
  • 客户端
  1. telnetClient类
#ifndef TELNETCLIENT_H
#define TELNETCLIENT_H

#include <QObject>
#include <QTcpSocket>

class TelnetClient : public QObject
{
    Q_OBJECT

public:
    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_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    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_OBJECT

public:
    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 client
    clientSocket->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_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    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.coloradmin.cn/o/2044944.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智慧节能节水设备远程监控解决方案

智慧节能节水设备远程监控解决方案&#xff0c;作为现代物联网技术与环保理念深度融合的产物&#xff0c;旨在通过高度集成的传感器网络、大数据分析及云计算平台&#xff0c;实现对各类节能节水设施的精细化管理和实时监控&#xff0c;从而大幅度提升资源利用效率&#xff0c;…

eNSP 华为三层交换机实现VLAN间通信

华为三层交换机实现VLAN间通信 三层交换机&#xff1a; <Huawei>sys [Huawei]sys SW-3 [SW-3]vlan batch 10 20 [SW-3]int vlan 10 [SW-3-Vlanif10]ip address 192.168.10.254 24 [SW-3-Vlanif10]int vlan 20 [SW-3-Vlanif20]ip add 192.168.20.254 24 [SW-3-Vlanif20]in…

Qt登录窗口设计

widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QIcon> //图标类 #include <QPushButton> #include <QLineEdit> //行编辑 #include <QLabel> #include <QTextEdit> #include <QMovie>class Widge…

专业名词理解(一):鲁棒性和泛化能力

目录 前言 一、鲁棒性&#xff08;Robustness&#xff09; 二、泛化能力&#xff08;Generalization&#xff09; 总结 前言 鲁棒性&#xff08;Robustness&#xff09;和泛化能力&#xff08;Generalization&#xff09;是机器学习和人工智能模型的重要特性&#xff0c;它…

CDD数据库文件制作(四)——服务配置(0x11)

目录 1.子功能创建2.会话切换配置2.1.根据诊断调查表进行信息提取(0x1101)2.2.会话转换配置(0x1101)2.3.根据诊断调查表进行信息提取(0x1102)2.4.会话转换配置(0x1102)2.5.根据诊断调查表进行信息提取(0x1103)2.6.会话转换配置(0x1103)2.7.会话切换配置完成后效果图…

R9 9900X R9 9950X评测:看完觉得7800X3D更香了

原文转载修改自&#xff08;更多互联网新闻/搞机小知识&#xff09;&#xff1a; R9 9900X R9 9950X评测&#xff1a;能效提升&#xff0c;温度下降 R9 9900X R9 9950X基础规格 注&#xff1a;评测信息来自外媒Wccftech 老规矩&#xff0c;先介绍一下这两款锐龙9000旗舰CPU的…

【笔记1-7】Qt bug记录:error C2371: QStringList重定义;不同的基类型,Qt6无法使用QStringList

在Qt5工程升级到Qt6的过程中&#xff0c;出现了QStringList重定义的问题 一开始尝试在其他文件中使用QStringList&#xff0c;结果是Qt5.9.4版本怎么使用都没有问题&#xff0c;而Qt6.7.2在其他文件中写同样的代码也会有问题 通过调查Qt源码&#xff0c;发现是Qt6对qcontainer…

栈与计算—— 150、227、224※

150. 逆波兰表达式求值&#xff08;中等&#xff09; 给你一个字符串数组 tokens &#xff0c;表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意&#xff1a; 有效的算符为 、-、* 和 / 。每个操作数&#xff08;运算对象&a…

web前端之实现一只可爱的小杰尼乌龟、伪元素、动画

MENU 前言效果图htmlstyle 前言 代码段使用HTML和CSS创建一个“杰尼龟”的动画。 效果图 html <div class"squirtle"><div class"tail"></div><div class"body"><div class"stomach"></div><d…

了解数据库中常用存储引擎数据结构(1)

目录 引言 存储引擎和存储结构 两者的关系 存储结构 分类 1. 按数据组织方式分类 2. 按索引结构分类 3. 按存储介质分类 4. 按数据分布方式分类 5. 按数据冗余和备份分类 存储结构需要的特性 BTree 补充知识&#xff1a;Lock和Latch的区别&#xff08;存储引擎并发…

干货分享|如何使用Stable Diffusion快速打造瞬息全宇宙?

Deforum也是一款文生视频插件&#xff0c;它把提示词跃迁和运镜结合到一起&#xff0c;生成的视频让人仿佛穿越不同时空&#xff0c;因此又被称作瞬息全宇宙。本节将介绍使用Deforum生成视频的方法。 在使用Deforum时&#xff0c;由于设置参数非常多&#xff0c;初次使用时很难…

【C语言篇】编译和链接以及预处理介绍(下篇)

文章目录 前言#和###运算符##运算符 命名约定#undef命令⾏定义条件编译#if和#endif多个分支的条件编译判断是否被定义嵌套指令 头文件被包含头文件被包含的方式本地文件包含库文件的包含 嵌套文件包含 其他预处理指令 写在最后 前言 本篇接前一篇【C语言篇】编译和链接以及预处…

fvm 管理多个 flutter 版本

前言&#xff1a; flutter SDK 版本更新还是比较快的&#xff0c;新的特性带来了新的体验&#xff0c;更新频繁也是好的事情。一方面说明 flutter 社区活跃&#xff0c;另一方面 说明 flutter 进化的脚本并没有停下。这样也会带来另一个问题&#xff0c;如果多个项目 使用了不…

详解Python 66 个内置函数!附代码

大家好&#xff0c;想掌握Python编程语言&#xff0c;从零基础的小白晋升为大神&#xff1f;没问题&#xff01;接下来我们将以轻松有趣的方式&#xff0c;逐一解锁Python的66个内置函数&#xff0c;每一步都将结合实际应用场景、函数功能解析及简洁代码演示&#xff0c;带你深…

超全面!Midjourney用户手册中文版!详解模型、命令、参数与高级用法

前言 引言 大家好&#xff0c;我是包大。 最近正在上手体验目前网上很火的 AI 绘画工具 Midjourney&#xff0c;在优设和 B 站上找了很多教程来看&#xff0c;现在基本可以上手用它生成很多好玩的图片了。 这里私心推荐一下优设网的 AI 绘画专题&#xff0c;专题里已经积累了…

Docker详细讲解

2013年发布至今&#xff0c; Docker一直广受瞩目&#xff0c;被认为可能会改变软件行业。 但是&#xff0c;许多人并不清楚 Docker 到底是什么&#xff0c;要解决什么问题&#xff0c;好处又在哪里&#xff1f;今天就来详细解释&#xff0c;帮助大家理解它&#xff0c;还带有简…

【Linux操作系统】进程概念

目录 一、进程概念1.1 什么是进程 二、task_struct内容分类2.1 标识符2.2 进程状态2.2.1 进程排队2.2.2 关于进程状态的表述——运行、阻塞、挂起2.2.3 Linux中具体的进程状态2.2.4 孤儿进程 2.3 进程优先级 三、Linux的调度与切换3.1 进程切换3.2 进程调度 四、环境变量4.1 ma…

产品文档全攻略:分类、价值及创建技巧

作者 | Josh Fechter 产品文档是产品附带的资料。这些文档包含产品工作的详细信息、使用指南、免责声明以及与产品相关的其他重要详细信息。 产品文档是一个广义的术语&#xff0c;并不仅仅是为了供消费者使用。产品文档还包括供内部组织使用的产品或服务的信息。这些文档文件…

KETTLE调用http传输中文参数的问题

场景&#xff1a;检查服务器异常&#xff08;hive&#xff09;服务&#xff0c;就通过http发送一条短信到手机上&#xff0c;内容类似&#xff1a;【通知】 S T A R T D A T E h i v e 服务检测异常 {START_DATE}_hive服务检测异常 STARTD​ATEh​ive服务检测异常{DB_ID}&#…

我的点赞功能(完整分页查询步骤)和快速刷题开发

文章目录 1.我的点赞分页展示1.分页查询工具类1.PageInfo.java 需要分页查询的就继承它&#xff0c;传值的时候pageNo和pageSize可以为空2.PageResult.java 根据条件从数据库中查询信息&#xff0c;然后设置这里的四个值即可得到分页查询结果 2.sun-club-application-controlle…