国庆放假作业5

news2024/9/21 4:27:23

1、qt实现TCP服务器和客户端

(1)服务器

头文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTcpServer>
#include <QTcpSocket>
#include <QList>
#include <QMessageBox>
#include <QDebug>

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 on_pushButton_clicked();
    //自定义槽函数申明
    void newConnection_slot();

    //处理readyRead信号对应的槽函数
    void readyRead_solt();

private:
    Ui::MainWindow *ui;

    //定义服务器指针
    QTcpServer *server;

    //定义客户端容器
    QList<QTcpSocket *> clientList;

};
#endif // MAINWINDOW_H

源文件

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //实例化一个服务器
    server = new QTcpServer(this);

    connect(server,&QTcpServer::newConnection,this,&MainWindow::newConnection_slot);
}

MainWindow::~MainWindow()
{
    delete ui;
}

//启动服务器按钮对应的槽函数
void MainWindow::on_pushButton_clicked()
{
    quint16 port = ui->lineEdit->text().toUInt();
    //监听客户端的连接请求
    if(!server->listen(QHostAddress::Any,port))
    {
        QMessageBox::information(this,"失败","监听失败");
        return ;
    }
    else
    {
        QMessageBox::information(this,"成功","服务器启动成功");
    }


}

//自定义槽函数
void MainWindow::newConnection_slot()
{
    qDebug()<<"你有新的客户端发来请求";

    //获取最新连接的客户端
    QTcpSocket *s = server->nextPendingConnection();

    //将套接字放入客户端链表中
    clientList.push_back(s);

    //此时如果有客户端向服务器发来数据,那么对应的客户端套接字就会自动发射一个readyRead信号
    //我们可以将该信号
    connect(s,&QTcpSocket::readyRead,this,&MainWindow::readyRead_solt);
}

//readyRead信号槽函数的实现
void MainWindow::readyRead_solt()
{
    qDebug()<<"有新的客户端消息发来了";

    //遍历客户端链表将无效的客户端移除清理
    for(int i=0;i<clientList.size();i++)
    {
        //判断当前套接字是否是有效连接
        if(clientList[i]->state()==0)  //此时为无效
        {
            //将该套接字移除客户端容器
            clientList.removeAt(i);
        }
    }
    //遍历客户端链表,判断是哪个客户端连接
    for(int i=0;i<clientList.size();i++)
    {
        //函数原型
        //功能:求当前客户端套接字中待读数据的套接字
        if(clientList[i]->bytesAvailable()!=0)
        {
            //将套接字中的数据读取出来
            QByteArray msg = clientList[i]->readAll();

            //将数据展示到ui界面
            ui->listWidget->addItem(QString::fromLocal8Bit(msg));

            //将接收到的数据,转发给所有客户端
            for(int j=0;j<clientList.size();j++)
            {
                clientList[j]->write(msg);
            }
        }
    }
}

主函数

#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

(2)客户端

头文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTcpSocket>  //客户端类
#include <QMessageBox>

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

    //自定义信号处理槽函数
    void connected_solt();

    //自定义数据信号处理槽函数
    void readyRead_solt();

    void disconnected_solt();

    void on_pushButton_clicked();

    void on_pushButton_3_clicked();

private:
    Ui::MainWindow *ui;

    //定义客户端指针
    QTcpSocket *socket;

    //定义字符串接收用户
    QString username;
};
#endif // MAINWINDOW_H

源文件

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //给客户端指针实例化对象
    socket = new QTcpSocket(this);

    connect(socket,&QTcpSocket::connected,this,&MainWindow::connected_solt);

    //如果服务器向客户端发来消息
    //我们可以将该信号连接到自定义的槽函数中
    connect(socket,&QTcpSocket::readyRead,this,&MainWindow::readyRead_solt);

    connect(socket,&QTcpSocket::disconnected,this,&MainWindow::disconnected_solt);
}

MainWindow::~MainWindow()
{
    delete ui;
}

//连接服务器按钮槽函数
void MainWindow::on_pushButton_2_clicked()
{
    //获取ui界面上的相关信息
    username = ui->lineEdit_4->text();
    QString ip = ui->lineEdit_2->text();
    quint16 port = ui->lineEdit_3->text().toUInt();

    //功能:将客户端连接到给定的服务器
    socket->connectToHost(ip,port);
}

//处理信号槽函数
void MainWindow::connected_solt()
{
    QMessageBox::information(this,"成功","你已经成功进入聊天室");

    //向服务器发送一条数据
    QString msg = username +":进入聊天室";

    socket->write(msg.toLocal8Bit());  //将数据写给服务器
}

//处理readyRead信号的槽函数定义
void MainWindow::readyRead_solt()
{
    //读取套接字中的信息
    QByteArray msg = socket->readAll();

    //将文字内容美国展示到ui界面
    ui->listWidget->addItem(QString::fromLocal8Bit(msg));
}

//发送按钮对应的槽函数
void MainWindow::on_pushButton_clicked()
{
    //获取ui界面输入的内容
    QString msg = username+": "+ ui->lineEdit->text();

    //发送给服务器
    socket->write(msg.toLocal8Bit());

    //清空编辑框内容
    ui->lineEdit->clear();
}

//断开服务器对应按钮槽函数
void MainWindow::on_pushButton_3_clicked()
{
    //告诉大家我走了
    QString msg = username+": 离开聊天室";
    socket->write(msg.toLocal8Bit());

    //断开连接
    socket->disconnectFromHost();

}

void MainWindow::disconnected_solt()
{
    QMessageBox::information(this,"提示","退出成功");
}

主函数

#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

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

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

相关文章

新手学习Python用哪个软件比较好?

对于新手学习Python&#xff0c;有几个常用的集成开发环境&#xff08;IDE&#xff09;可以选择。以下是一些受欢迎的选择&#xff0c;可供题主参考下载使用。 集成开发环境&#xff08;IDE&#xff09; 1. PyCharm&#xff1a; PyCharm 是一款功能强大的 Python IDE&#x…

Vmware 静态网络配置

概述 仅主机模式&#xff08;VMware1&#xff09;&#xff1a;使用host-only的方式是不能和外界通信的&#xff0c;只能够和本机的物理网卡通信 桥接&#xff08;VMnet0&#xff09;&#xff1a;使用桥接的方式使得自己的虚拟机和自己的真实机网卡在同一个网段 NAT&#xff0…

穿越时空的创新:解析云原生与Web3.0的奇妙渊源

文章目录 云原生的崛起云原生的关键特点 Web3.0的崭露头角Web3.0的关键特点 云原生与Web3.0的交汇点1. 去中心化应用程序的部署2. 安全性和可信性3. 去中心化身份管理4. 数据的分布和共享 云原生与Web3.0的未来1. 云原生的区块链支持2. Web3.0的企业应用3. 数据交互的革命4. 新…

FFmpeg:打印音/视频信息(Meta信息)

多媒体文件基本概念 多媒体文件其实是个容器在容器里面有很多流(Stream/Track)每种流是由不同的编码器编码的从流中读出的数据称为包在一个包中包含着一个或多个帧 几个重要的结构体 AVFormatContextAVStreamAVPacket FFmpeg操作流数据的基本步骤 打印音/视频信息(Meta信息…

计算机考研 | 2021年 | 计算机组成原理真题

文章目录 【计算机组成原理2021年真题43题-15分】【第一步&#xff1a;信息提取】【第二步&#xff1a;具体解答】【第三步&#xff1a;总结】 【计算机组成原理2021年真题44题-8分】【第一步&#xff1a;信息提取】【第二步&#xff1a;具体解答】 【计算机组成原理2021年真题…

JavaScript实战游戏逻辑

● 在做猜游戏之前&#xff0c;我们肯定要随机生成一个数字。那就跟之前掷色子的游戏一样 const number Math.trunc(Math.random() * 20) 1; //生成一个1-20的随机数字● 之后&#xff0c;在输入正确的时候我们肯定需要在问号上面显示出来 ● 在测试阶段&#xff0c;我们可…

Java多线程同步锁、Lock锁和等待唤醒机制及代码演示

多线程入门学习路线 线程的生命周期线程的安全问题同步代码块同步方法Lock锁生产者和消费者&#xff08;等待唤醒机制&#xff09; 线程的生命周期 问&#xff1a;sleep方法会让线程睡眠&#xff0c;睡眠时间到了之后&#xff0c;立马就会执行下面的代码吗? 解&#xff1a;sl…

安装使用TinyCore Linux的一些收获

为了学习Linux Shell编程&#xff0c;决定安装一个纯粹的Linux&#xff0c;由于电脑硬件配置较低&#xff0c;选择了最轻量化Llinux操作系统版本TinyCore Linux。 一、TinyCore Linux有三个版本 打开TinyCore Linux的下载页面 http://www.tinycorelinux.net/downloads.html&a…

跨境电商测评内幕及自养号技术教学

现在测评行业的水越来越深了。几年前的测评行业都是邮箱联系老外&#xff0c;大多是一些产品的爱好者&#xff0c;评价也很真实公正。而现在&#xff0c;大量人加入&#xff0c;还有一些中介的参与&#xff0c;及骗子中介、黑心测评买家都纷纷的涌入了市场。 我们公司专业做底…

【计算机网络】高级IO初步理解

文章目录 1. 什么是IO&#xff1f;什么是高效 IO? 2. IO的五种模型五种IO模型的概念理解同步IO与异步IO整体理解 3. 阻塞IO4. 非阻塞IOsetnonblock函数为什么非阻塞IO会读取错误&#xff1f;对错误码的进一步判断检测数据没有就绪时&#xff0c;返回做一些其他事情完整代码myt…

好奇喵 | Tor浏览器——层层剥开洋葱

前言 在之前的博客中&#xff0c;Surface Web —&#xff1e; Deep Web —&#xff1e; Dark Web&#xff0c;我们解释了表层网络、深层网络等的相关概念。 本篇博客介绍Tor浏览器&#xff0c;并且把Tor浏览器的洋葱层层剥开&#xff0c;了解其历史&#xff0c;工作原理&…

c++的发展史以及如何学习

文章目录 1. 什么是C 2. C发展史 3. C的重要性 4. 如何学习C 文章内容 1. 什么是C C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&#xff0c;规模较大的 程序&#xff0c;需要高度的抽象和建模时&#xff0c;C语言则不合适。为了解决软…

【AI视野·今日Robot 机器人论文速览 第四十七期】Wed, 4 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Wed, 4 Oct 2023 Totally 40 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;基于神经网络的多模态触觉感知, classification, position, posture, and force of the grasped object多模态形象的解耦(f…

Pikachu靶场——远程命令执行漏洞(RCE)

文章目录 1. RCE1.1 exec "ping"1.1.1 源代码分析1.1.2 漏洞防御 1.2 exec "eval"1.2.1 源代码分析1.2.2 漏洞防御 1.3 RCE 漏洞防御 1. RCE RCE(remote command/code execute)概述&#xff1a; RCE漏洞&#xff0c;可以让攻击者直接向后台服务器远程注入…

二叉树经典例题

前言&#xff1a; 本文主要讲解了关于二叉树的简单经典的例题。 因为二叉树的特性&#xff0c;所以关于二叉树的大部分题目&#xff0c;需要利用分治的思想去递归解决问题。 分治思想&#xff1a; 把大问题化简成小问题&#xff08;根节点、左子树、右子树&#xff09;&…

【C++】STL详解(十)—— 用红黑树封装map和set

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;C学习 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 上一篇博客&#xff1a;【C】STL…

国庆中秋特辑(八)Spring Boot项目如何使用JPA

目录 一、Spring Boot 项目使用 JPA 的步骤二、Spring Boot 项目使用 JPA 注意事项三、Spring Boot 项目使用 JPA 常用语法 Spring Boot项目如何使用JPA&#xff0c;具体如下 一、Spring Boot 项目使用 JPA 的步骤 添加依赖 在项目的 pom.xml 文件中添加 Spring Boot JPA 和数…

如何使用 ChatGPT 创建强大的讲故事广告

shadow&#xff1a; 使用AI技术来辅助创作故事越来越流行&#xff0c;从事营销相关工作的人员需要不断适应和学习新的技术和工具&#xff0c;以应对行业的变化和挑战。 如何使用ChatGPT创建讲故事的广告&#xff1a; A. 确定品牌故事和信息传递B. 确定目标受众C. 开发概念D. 使…

【LeetCode热题100】--153.寻找旋转排序数组中的最小值

153.寻找旋转排序数组中的最小值 由于该排序数组经由1到n次旋转&#xff0c;所以旋转后的数组折线图为&#xff1a; 最小值处于中间&#xff0c;同时对于最后一个元素x&#xff1a;在最小值右侧的元素&#xff0c;它们的值一定严格小于x,而在最小值左侧的元素&#xff0c;它们的…

因为在此系统上禁止运行脚本

问题&#xff1a; 解决办法&#xff1a; vue项目搭建中"因为在此系统上禁止运行脚本"报错&#xff0c;解决方法 - 你的剧本 - 博客园 (cnblogs.com)