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);
            }
        }
    }
}

运行截图:

相关推荐
南岩亦凛汀1 小时前
在Linux下使用wxWidgets进行跨平台GUI开发
c++·跨平台·gui·开源框架·工程实战教程
曦月逸霜2 小时前
第34次CCF-CSP认证真题解析(目标300分做法)
数据结构·c++·算法
galaxy_strive2 小时前
绘制饼图详细过程
开发语言·c++·qt
Unpredictable2223 小时前
【VINS-Mono算法深度解析:边缘化策略、初始化与关键技术】
c++·笔记·算法·ubuntu·计算机视觉
PingdiGuo_guo4 小时前
C++智能指针的知识!
开发语言·c++
Chuncheng's blog4 小时前
CentOS 7如何编译安装升级gcc至7.5版本?
linux·运维·c++·centos
愚润求学6 小时前
【C++】类型转换
开发语言·c++
@我漫长的孤独流浪6 小时前
数据结构测试模拟题(4)
数据结构·c++·算法
csdnzzt6 小时前
从内存角度透视现代C++关键特性
c++
jie188945758667 小时前
C++ 中的 const 知识点详解,c++和c语言区别
java·c语言·c++