DAY4,Qt(事件处理机制的使用,Qt中实现服务器的原理)

1.Qt中实现服务器的原理;

---chatser.h---头文件
#ifndef CHATSER_H
#define CHATSER_H

#include 
#include   //服务器类
#include   //套接字类
#include   //消息对话类
#include   //链表容器
#include   //信息调试类

QT_BEGIN_NAMESPACE
namespace Ui { class Chatser; }
QT_END_NAMESPACE

class Chatser : public QWidget
{
    Q_OBJECT

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

private slots:
    void on_start_btn_clicked();  //启动服务器按钮槽函数
    void newConnection_slot();  //处理cli连接信号槽
    void readyRead_slot();  //处理cli发送数据信号槽

private:
    Ui::Chatser *ui;

    QTcpServer *server;  //定义服务器指针
    QList socketList;  //定义客户端容器
};
#endif // CHATSER_H
---chatser.cpp---函数实现文件
#include "chatser.h"
#include "ui_chatser.h"

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

    server = new QTcpServer(this);  //给服务器指针实例化空间
}

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

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

    //将服务器设为监听状态
    if(server->listen(QHostAddress::Any,port))
    {
        QMessageBox::information(this,"listen","服务器启动成功");
    }else
    {
        QMessageBox::information(this,"listen","服务器启动失败");
    }

    //如果有客户端发来连接请求,那么该服务器就会自动发射一个newConnection信号
    //将客户端连接信号与对应槽函数连接
    connect(server,&QTcpServer::newConnection,this,&Chatser::newConnection_slot);
}

//处理cli连接信号槽
void Chatser::newConnection_slot()
{
    qDebug()<<"有新客户端连接";
    //获取最新连接的客户端套接字
    QTcpSocket *s = server->nextPendingConnection();

    //将套接字放入客户端容器中
    socketList.push_back(s);

    //如果有客户端向服务器发来数据,那么该客户端会自动发射一个readyRead信号
    //将客户端发送数据信号与对应槽函数连接
    connect(s,&QTcpSocket::readyRead,this,&Chatser::readyRead_slot);
}

//处理cli发送数据信号槽
void Chatser::readyRead_slot()
{
    //移除无效客户端
    for(int i=0; istate() == 0)  //state函数返回值为枚举值,
        {                                   //0表示无效连接
            socketList.removeAt(i);
        }
    }

    //遍历客户端套接字,寻找哪个客户端有数据待读
    for(int i=0; ibytesAvailable() != 0)
        {
            //读取数据
            QByteArray msg = socketList.at(i)->readAll();

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

            //将数据发送给所有的客户端
            for(int j=0; jwrite(msg);
            }
        }
    }

}










---main.cpp---测试文件
#include "chatser.h"

#include 

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Chatser w;
    w.show();
    return a.exec();
}
结果展示--- 

DAY4,Qt(事件处理机制的使用,Qt中实现服务器的原理)_第1张图片

 

2.今日思维导图;

 

你可能感兴趣的:(qt,qt,开发语言,c++,服务器)