国庆10.4

这篇具有很好参考价值的文章主要介绍了国庆10.4。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

QT实现TCP服务器客户端

服务器

头文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpServer>       //服务器头文件
#include <QTcpSocket>       //客户端头文件
#include <QList>            //链表容器
#include <QMessageBox>      //消息对话框
#include <QDebug>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_startBtn_clicked();

    void newConnection_slot();      //自定义处理newConnection信号槽函数的声明

    void readyRead_slot();          //自定义处理readyRead信号的槽函数的声明

private:
    Ui::Widget *ui;

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

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

};
#endif // WIDGET_H

源文件

#include "widget.h"
#include "ui_widget.h"

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

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

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

}

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

//启动服务器按钮对应的槽函数
void Widget::on_startBtn_clicked()
{
    quint16 port = ui->portEdit->text().toUInt();       //获取ui界面上的端口号

    //监听客户端的连接请求
    if(!server->listen(QHostAddress::Any, port))
    {
        QMessageBox::information(this, "失败", "监听失败");
    }else
    {
        QMessageBox::information(this, "成功", "服务器启动成功");
    }
}

//自定义处理newConnection信号的槽函数的实现
void Widget::newConnection_slot()
{
    qDebug()<<"您有新的客户端发来连接请求了";

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

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

    //至此,多个客户端已经跟服务器建立连接,并放入客户端容器中了
    connect(s, &QTcpSocket::readyRead, this, &Widget::readyRead_slot);

}

//readyRead信号对应槽函数的实现
void Widget::readyRead_slot()
{
    //可以添加提示音

    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->msgWidget->addItem( QString::fromLocal8Bit(msg) );

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

客户端

头文件

#ifndef WIDGET_H
#define WIDGET_H

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

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_connectBtn_clicked();

    void connected_slot();      //自定义处理connected信号的槽函数

    void readyRead_slot();

    void on_sendBtn_clicked();

    void on_disconnectBtn_clicked();

    void disconnected_slot();       //自定义处理disconnected信号的槽函数声明

private:
    Ui::Widget *ui;

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

    //定义字符串接收用户
    QString userName;

};
#endif // WIDGET_H

源文件

#include "widget.h"
#include "ui_widget.h"

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

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

    //由于只需要连接一次,所以将连接写在构造函数中
    connect(socket, &QTcpSocket::connected, this, &Widget::connected_slot);

    //如果服务器向客户端发来消息,那么该客户端就会自动发射一个readyRead信号
    connect(socket, &QTcpSocket::readyRead, this, &Widget::readyRead_slot);

    //当成功与服务器断开连接后,该客户端会自动发射一个disconnected的信号
    connect(socket, &QTcpSocket::disconnected, this, &Widget::disconnected_slot);
}

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

//连接服务器按钮对应的槽函数
void Widget::on_connectBtn_clicked()
{
    //获取ui界面上的相关信息
    userName = ui->userNameEdit->text();        //获取用户名
    QString ip = ui->ipEdit->text();            //主机地址
    quint16 port = ui->portEdit->text().toUInt();        //端口号

    socket->connectToHost(ip, port);
}

//处理connected信号的槽函数的定义
void Widget::connected_slot()
{
    QMessageBox::information(this, "成功", "您已经成功进入聊天室");

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

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

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

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

}

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

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

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

}

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

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

}

//disconnected信号对应槽函数的定义
void Widget::disconnected_slot()
{
    QMessageBox::information(this, "提示", "退出成功");
}

现象

国庆10.4,作业,c++

国庆10.4,作业,c++

国庆10.4,作业,c++文章来源地址https://www.toymoban.com/news/detail-728903.html

到了这里,关于国庆10.4的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【ARM 嵌入式 编译系列 10.4 -- 生成二进制文件】

    在嵌入的工作中,经常会使用到二进制文件,那么我们如何自己生成一个二进制文件呢?接下来介绍如何将一个只包含将32位数据的文件转化为二进制文件,原文件如下(数据一共 64bytes): 我们使用 gcc 对齐先进行编译然后再进行反汇编: 具体命令如下: 通过上面命令会生成

    2024年02月02日
    浏览(38)
  • dotnetcharting|||.netCHARTING 10.4 for .NET6-WEB

    .NET 6.0 Chart Support .netCHARTING 10.4 adds both a .NET 6.0 chart nuget package and .NET 6.0 chart sample bundle (requires Visual Studio 2022), .NET 5 was the successor of .NET Core 3.1 and .NET Framework 4.8, aims to provide .NET developers with a new cross-platform development experience. .NET 6.0 expands on this with simplified development, better perfo

    2024年02月08日
    浏览(21)
  • 文心一言 VS 讯飞星火 VS chatgpt (123)-- 算法导论10.4 4题

    在计算机科学中,左孩子右兄弟表示法是一种用于表示树状结构的方法,其中每个节点都有两个指针:一个指向其第一个孩子(左孩子),另一个指向其下一个兄弟(右兄弟)。对于一个有根树,我们可以使用一个数组来表示它,其中每个索引对应一个节点,每个节点包含两

    2024年02月08日
    浏览(32)
  • MATLAB机器人工具箱详解1—RTB 10.4版本简介及安装

    机器人学工具箱(Robotic Toolbook for Matlab) 是matlab中专门用于机器人仿真的工具箱,在机器人建模、轨迹规划、控制、可视化方面使用非常方便。本次安装环境为Windows 11+MATLAB 2023a,所安装的机器人工具箱的版本为RTB 10.4,后续将有详细的讲解不同的机器人工具箱的版本区别。

    2024年02月05日
    浏览(34)
  • 10.4K Star!程序员为程序员针对性优化的开源免费笔记

    平时我一直用Notion来记录内容为主,但也一直关注着其他开源产品。上周正好看到一款非常受欢迎的开源免费笔记,今天就推荐给大家: VNote 。 VNote一个由程序员为程序员打造的开源笔记应用,基于Qt开发,专注于使用 Markdown 来写作的群体。它提供完美的编辑体验和强大的笔

    2024年02月12日
    浏览(36)
  • Elastic stack8.10.4搭建、启用安全认证,启用https,TLS,SSL 安全配置详解

    ELK大家应该很了解了,废话不多说开始部署 kafka在其中作为消息队列解耦和让logstash高可用 kafka和zk 的安装可以参考这篇文章 深入理解Kafka3.6.0的核心概念,搭建与使用-CSDN博客 需要 elasticsearch-8.10.4 logstash-8.10.4 kibana-8.10.4 kafka_2.13-3.6.0 apache-zookeeper-3.9.1-bin.tar filebeat-8.10.4-linux-

    2024年02月04日
    浏览(32)
  • 10.3作业

    #include myhead.h int main(int argc, const char *argv[]) { mkfifo(“./f1”,0777); mkfifo(“./f2”,0777); pid_t cpid = fork(); if(0 cpid) { int fdw = open(“./f1”,O_WRONLY); int fdr = open(“./f2”,O_RDONLY); char buf[128] = “”; while(1) { bzero(buf,sizeof(buf)); printf(“父进程请输入n”); scanf(“%s”,buf); write(fdw,buf,sizeof(buf));

    2024年02月07日
    浏览(30)
  • 第10讲 结构 单元作业

    1.  有一组关于学生成绩的信息,编写函数max,该函数返回值为分数最高的学生的信息(包括学号和分数)。再编写主函数对其进行调用并输出最高分者的信息。假设结构类型定义为: struct student {   char  *num;   int   score; }; 提示:num定义为指针类型,注意向其复制内容之前

    2024年02月04日
    浏览(27)
  • 7.10 qt作业

    闹钟

    2024年02月16日
    浏览(28)
  • 10月31日作业

    2024年02月07日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包