QTday5 2024-06-19

作业要求:

1.思维导图

2.整理代码:TCP服务器

作业1:思维导图

作业2:整理代码

运行代码:

widget.h
cpp 复制代码
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpServer>
#include <QList>
#include <QMessageBox>
#include <QTcpSocket>
#include <QByteArray>
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();
    void readyRead_slot();

private:
    Ui::Widget *ui;
    //套接字文件
    QTcpServer *server;
    QList<QTcpSocket *> socketlist;

};
#endif // WIDGET_H
widget.cpp
复制代码
#include "widget.h"
#include "ui_widget.h"

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

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


void Widget::on_startBtn_clicked()
{
    //1.创建好套接字后,首先绑定port
    quint16 port = ui->portEdit->text().toUInt();
    //2.开启监听
    if(server->listen(QHostAddress::Any,port)){
        //开启监听成功
        QMessageBox::information(this,"提示","开启监听成功",QMessageBox::Ok);
    }else{
        //开启监听失败
        QMessageBox::information(this,"提示","开启监听失败",QMessageBox::Ok);
        return;
    }
    //运行至此,开始连接newConnection()函数和槽
    connect(server,&QTcpServer::newConnection,this,&Widget::newConnection_slot);

}

void Widget::newConnection_slot()
{
    //进入该函数,说明接受到客户端的连接
    //1.创建用于通信的套接字文件
    QTcpSocket *s = server->nextPendingConnection();
    //2.放入套接字容器
    socketlist.push_back(s);
    //发送信号readyread,将套接字与对应槽函数连接,从而可以实现通信。
    connect(s,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);
}

void Widget::readyRead_slot()
{
    //首先去除无效套接字文件。
    for(int i=0;i<socketlist.count();i++){
        if(socketlist.at(i)->state()==0){
            //说明无效,从列表中去除
            socketlist.removeAt(i);
        }
    }
    //接受信息
    for(int i=0;i<socketlist.count();i++){
        if(socketlist.at(i)->bytesAvailable()!=0){
            //说明接受到了信息
            QByteArray msg = socketlist.at(i)->readAll();
            ui->msgList->addItem(QString::fromLocal8Bit(msg));
            for(int j=0;j<socketlist.count();j++){
                socketlist.at(j)->write(msg);
            }
        }
    }
}

运行截图:

相关推荐
selfsongs10 小时前
指针、内存管理、现代 C++ 特性
c++
吃着火锅x唱着歌11 小时前
Effective C++ 学习笔记 条款37 绝不重新定义继承而来的缺省参数值
c++·笔记·学习
2401_8414956411 小时前
【数据结构】B+树
数据结构·数据库·c++·b+树·概念·结构·操作原理
小保CPP11 小时前
OCR C++ Tesseract按行识别字符
c++·人工智能·ocr·模式识别·光学字符识别
阿米亚波12 小时前
【C++】流式数据输入处理(不完全整理)
开发语言·c++·笔记
皓月斯语13 小时前
【C++基础】三目运算符
开发语言·数据结构·c++
初願致夕霞14 小时前
C++懒汉单例设计详解
服务器·开发语言·c++
脱胎换骨-军哥14 小时前
C++分布式系统设计:从通信引擎到分布式共识
开发语言·c++·分布式
脱胎换骨-军哥15 小时前
C++零成本抽象理论深度拆解:现代C++如何在不牺牲性能的前提下提供高级语法封装
java·开发语言·c++
_wyt00115 小时前
01背包问题详解
c++·背包dp