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

运行截图:

相关推荐
鸭子程序员3 小时前
c++ 算法
开发语言·c++·算法
不会c嘎嘎4 小时前
算法百练,直击OFFER -- day5
c++·算法
序属秋秋秋4 小时前
《Linux系统编程之进程环境》【环境变量】
linux·运维·服务器·c语言·c++·操作系统·系统编程
乌萨奇也要立志学C++4 小时前
【洛谷】二分查找专题 告别二分死循环!模板 + 细节 + 实战
c++·算法
Rock_yzh4 小时前
LeetCode算法刷题——128. 最长连续序列
数据结构·c++·算法·哈希算法
wheeldown4 小时前
【Rokid+CXR-M】基于Rokid CXR-M SDK的博物馆AR导览系统开发全解析
c++·人工智能·ar
利刃大大5 小时前
【c++中间件】语音识别SDK && 二次封装
开发语言·c++·中间件·语音识别
晨非辰5 小时前
C++ 波澜壮阔 40 年:从基础I/O到函数重载与引用的完整构建
运维·c++·人工智能·后端·python·深度学习·c++40周年
艾莉丝努力练剑8 小时前
【C++:C++11】C++11新特性深度解析:从可变参数模板到Lambda表达式
c++·stl·c++11·lambda·可变模版参数
同学小张10 小时前
【端侧AI 与 C++】1. llama.cpp源码编译与本地运行
开发语言·c++·aigc·llama·agi·ai-native