客户端各组件之间通信 QLocalServer QLocalSocket 网络模块(八)

一、简述
1.互联网公司的客户端经常由n多个组件构成,组件之间的数据共享以及通信都是利用本地套接字完成
2.组件之间约定报文协议,定义公共字段和业务字段,各组件解析报文完成通信
二、效果图
在这里插入图片描述
三、本地套接字通信示例代码

#ifndef LOCALCHARTROOM_H
#define LOCALCHARTROOM_H

#include <QWidget>
#include <QLocalServer>
#include <QLocalSocket>
#include <QDateTime>
#include <QEventLoop>
#include <QTimer>
namespace Ui {
class LocalChartRoom;
}
class LocalChartRoom : public QWidget
{
   Q_OBJECT

public:
   explicit LocalChartRoom(QWidget *parent = nullptr);
   ~LocalChartRoom();
   void initClient();
   void initServer();

private slots:
   void on_pushButton_clicked();
   void on_pushButton_4_clicked();

   void on_ServerConnected();
   void on_ServerReadyRead();

   void on_pushButton_2_clicked();
   void on_pushButton_3_clicked();

   void on_ClientReadyRead();
   void on_Clientdisconnected();
   void on_ClientConnected();

   void on_pushButton_6_clicked();
   void on_pushButton_5_clicked();

private:
   Ui::LocalChartRoom *ui;
   QLocalServer mServer;
   QLocalSocket mClientsocket;
   QEventLoop mLoop;
   QLocalSocket *m_pServerSocket;
};

#endif // LOCALCHARTROOM_H

#include "localchartroom.h"
#include "ui_localchartroom.h"

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

LocalChartRoom::~LocalChartRoom()
{
    delete ui;
}
//************************************************client
void LocalChartRoom::initClient()
{
    disconnect(&mClientsocket,SIGNAL(connected()),this,SLOT(on_ClientConnected()));
    disconnect(&mClientsocket,SIGNAL(disconnected()),this,SLOT(on_Clientdisconnected()));
    disconnect(&mClientsocket,SIGNAL(readyRead()),this,SLOT(on_ClientReadyRead()));
    connect(&mClientsocket,SIGNAL(connected()),this,SLOT(on_ClientConnected()));
    connect(&mClientsocket,SIGNAL(disconnected()),this,SLOT(on_Clientdisconnected()));
    connect(&mClientsocket,SIGNAL(readyRead()),this,SLOT(on_ClientReadyRead()));
    mClientsocket.connectToServer("ChartRoom");
}
void LocalChartRoom::on_ClientConnected()
{
    qDebug()<<"on_ClientConnected";
}
void LocalChartRoom::on_Clientdisconnected()
{
    qDebug()<<"on_Clientdisconnected";

}
void LocalChartRoom::on_ClientReadyRead()
{
    ui->textBrowser->append(QDateTime::currentDateTime().toString("yyyy-mm-dd hh:mm:ss.ms") + "\n" + "server:" + mClientsocket.readAll());
}
//************************************************client

//************************************************server
void LocalChartRoom::initServer()
{
    disconnect(&mServer,SIGNAL(newConnection()),this,SLOT(on_ServerConnected()));
    mServer.removeServer("ChartRoom");
    connect(&mServer,SIGNAL(newConnection()),this,SLOT(on_ServerConnected()));
    mServer.listen("ChartRoom");
}
void LocalChartRoom::on_ServerConnected()
{
    m_pServerSocket = mServer.nextPendingConnection();
    connect(m_pServerSocket,SIGNAL(readyRead()),this,SLOT(on_ServerReadyRead()));
}
void LocalChartRoom::on_ServerReadyRead()
{
    ui->textBrowser_2->append(QDateTime::currentDateTime().toString("yyyy-mm-dd hh:mm:ss.ms") + "\n" + "client:" + m_pServerSocket->readAll());
}
//************************************************server


void LocalChartRoom::on_pushButton_clicked()
{
    ui->textBrowser->append(QString::fromLocal8Bit("正在连接服务端..."));
    QTimer::singleShot(1000,this,[=](){
        mLoop.quit();
    });
    mLoop.exec();
    initClient();
    ui->textBrowser->append(QString::fromLocal8Bit("服务端连接成功"));
}

void LocalChartRoom::on_pushButton_4_clicked()
{
    ui->textBrowser_2->append(QString::fromLocal8Bit("正在启动服务端..."));
    QTimer::singleShot(1000,this,[=](){
        mLoop.quit();
    });
    mLoop.exec();
    initServer();
    ui->textBrowser_2->append(QString::fromLocal8Bit("服务端启动成功"));
}

void LocalChartRoom::on_pushButton_2_clicked()
{
    //client send msg
    mClientsocket.write(ui->lineEdit->text().toLatin1());
    mClientsocket.flush();
    ui->lineEdit->clear();
}

void LocalChartRoom::on_pushButton_3_clicked()
{
    //server send msg
    if(!mServer.isListening())
        return;
    m_pServerSocket->write(ui->lineEdit_2->text().toLatin1());
    m_pServerSocket->flush();
    ui->lineEdit_2->clear();
}

void LocalChartRoom::on_pushButton_6_clicked()
{
    //client close
    mClientsocket.disconnectFromServer();
    ui->textBrowser->append(QString::fromLocal8Bit("已经断开服务器连接..."));
}

void LocalChartRoom::on_pushButton_5_clicked()
{
    //server close
    mServer.close();
    mServer.removeServer("ChartRoom");
    ui->textBrowser_2->append(QString::fromLocal8Bit("服务器停止提供服务..."));

}

四、总结
1.套接字本质上是输入输出设备,自然支持读写操作
在这里插入图片描述
2.注意读、写、连接、断开连接阻塞类方法的调用
在这里插入图片描述

发布了30 篇原创文章 · 获赞 1 · 访问量 1138

猜你喜欢

转载自blog.csdn.net/u010906468/article/details/104931381