08 qt进程和网络编程(cs模型)

2023-10-15 18:35:23 浏览数 (1)

一 、qt进程

qt中进程最主要的任务就是启动额外应用程序 并且跟他们之间通信。进程类为QProcess

定义

用途

Header:

#include

qmake:

QT = core

Inherits:

QIODevice//继承于IO设备类

1.1 QProcess基本使用

第一步:创建一个QProcess对象

代码语言:javascript复制
// process = new QProcess(this); //说明启动的额外的应用程序与当前qt应用程序是依赖关系
process = new QProcess;//说明启动的额外的应用程序与当前qt应用程序是无依赖关系,可以脱离你独立运行

第二步:将要执行的应用 程序名字或者路径 应用 程序名字,做为start函数的参数即可

代码语言:javascript复制
void MainWindow::on_startButton_clicked()
{
  // process->start("C:/Users/PC/Desktop/FeiQ.exe"); //ok
   process->start("notepad"); //额外应用程序notepad就相当于process
}
1.2 启动多个的额外应用程序

常用接口:

  1. 启动应用程序

定义

用途

void

start(const QString &program, const QStringList &arguments, QIODevice::OpenMode mode = ReadWrite)

void

start(const QString &command, QIODevice::OpenMode mode = ReadWrite)

void

start(QIODevice::OpenMode mode = ReadWrite)

参数说明:

  • const QString &program ----- 启动的应用程序名,最好加路径
  • const QString &command ----> 启动的命令
  • const QStringList &arguments ----> 启动应用程序时,需要设置的参数列表
  1. 设置要启动的应用 程序和参数

定义

用途

void

setProgram(const QString &program)

void

setArguments(const QStringList &arguments)

以上两个接口,结合void start(QIODevice::OpenMode mode = ReadWrite)一起使用

  1. 让程序进入阻塞状态

定义

用途

bool

waitForFinished(int msecs = 30000)

bool

waitForStarted(int msecs = 30000)

Blocks until the process has finished and the finished() signal has been emitted, or until msecs milliseconds have passed.

  1. 杀死进程

定义

用途

void

kill()//杀掉进程

它通常跟void waitForFinished(int msecs = 30000)

  1. 进程运行状态

定义

用途

QProcess::ProcessState

state() const//获取当前进程所运行状态

QProcess::ProcessState

定义

数值

用途

QProcess::NotRunning

0

The process is not running.

QProcess::Starting

1

The process is starting, but the program has not yet been invoked.

QProcess::Running

2

The process is running and is ready for reading and writing.

代码语言:javascript复制
void MainWindow::on_notepadButton_clicked()
{
    if(QProcess::Running == process->state())
    {
        process->kill();
        process->waitForFinished();
    }
    process->start("notepad");
}

void MainWindow::on_calcButton_clicked()
{
    if(QProcess::Running == process->state())
    {
        process->kill();
        process->waitForFinished();
    }
   process->start("calc");
}

void MainWindow::on_qtButton_clicked()
{
    if(QProcess::Running == process->state())
    {
        process->kill();
        process->waitForFinished();
    }
   process->start("C:/Users/PC/Desktop/Lucky_draw.exe");
}
1.3 进程间数据传输

因为QProcess类继承于QIODevice,它也是一种io设备,那么,它也可以读取数据 QIODvice常用信号:

定义

用途

void

readyRead()//当QProcess有数据可以读取时,会发送这个信号

用户想要读取它的数据时,只需要跟该信号建立信号和槽,在槽函数时,可以 通过readAll()读数据, 因为该信号只相当于一个通知,并不传输数据

定义

用途

QByteArray

read(qint64 maxSize)

QByteArray

readAll()

基本实现:

代码语言:javascript复制
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    process = new QProcess;

    //当proces进程有数据可读取时,那么它会自动发送一个信号 readyRead()
    connect(process,&QProcess::readyRead,this,&MainWindow::readData);
}

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

void MainWindow::readData()
{
    qDebug() << "------";
  QByteArray data = process->readAll();
  qDebug() << data;
}

void MainWindow::on_startButton_clicked()
{
       process->start("ipconfig");
}

二 qt网络编程

网络软件协议:

  • 网络大致分为两种模型:OSITCP/IP
  • OSI:七层: 应用 表示 会话 传输 网络 数据链路 物理层
  • TCP/IP:四层:应用 传输 网络 物理层
  • 应用层:http ftp
  • 传输:TCP UDP
  • 网络:IP

在QT中,对于网络编程,也是采用模块化管理

代码语言:javascript复制
To link against the Qt Network module, add this line to the project file(.pro):
  QT  = network // 在当前工程中,增加网络,工程中才可以 使用网络接口API
2.1 TCP网络通信

TCP通信是基于C/S模型

  • C---- 客户端
  • S ---- 服务端

客户端和服务端之间通信以3次握手,建立边连接后,才开始发送数据 在Qt客户端和服务端分别使用来封装

客户端:

定义

用途

QTcpSocket

TCP socket

服务端:

定义

用途

QTcpServer

TCP-based server

在客户端与服务端通信之间,服务端必须先开启。

QTcpSocket— 客户端

定义

用途

Header:

#include

qmake:

QT = network //在pro文件中所要增加的 模块

Inherits:

QAbstractSocket//基类

客户端的实现步骤: 第一步:创建客户端对象 第二步:根据ip地址和端口号,向服务器发起连接

定义

用途

virtual void

connectToHost(const QString &hostName, quint16 port, QIODevice::OpenMode openMode = ReadWrite, QAbstractSocket::NetworkLayerProtocol protocol = AnyIPProtocol)

virtual void

connectToHost(const QHostAddress &address, quint16 port, QIODevice::OpenMode openMode = ReadWrite)

代码语言:javascript复制
const QString &hostName  ------ 》服务端的ip地址
quint16 port -----》服务端的端口号
const QHostAddress &address ------》服务端的主机对象,通用使用ip地址做为字符串参数,再使用构造函数来完成该对象的创建QHostAddress(const QString &address)

第三步:和服务器进行通信:读或者写

读:

定义

用途

qint64

read(char *data, qint64 maxSize)

QByteArray

read(qint64 maxSize)

QByteArray

readAll()

写:

定义

用途

qint64

write(const char *data, qint64 maxSize)

qint64

write(const char *data)qint

64write

(const QByteArray &byteArray)

思考:客户端什么时候要进行数据读取 ----- 信号和槽

定义

用途

void

readyRead()

当客户端有数据读取时,也会发送一个信号,只需要建立该信号和槽连接,在槽中进行数据读取

服务端— QTcpServer

定义

用途

Header:

#include

qmake:

QT = network//使用类所要增加的模块

Inherits:

QObject//基类

服务端实现步骤: 第一步:创建一个服务端对象 第二步:调用listen来监听是否用新的客户端来进行连接—listen()

代码语言:javascript复制
bool QTcpServer::
listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0)

参数说明: 参数一:const QHostAddress &address = QHostAddress::Any — 所有网络设备 参数二:quint16 port ---- 跟客户端保持一致端口号 第三步:当有新的客户端来进行连接时,服务端会发出一个信号:newConnection() 第四步:在服务端建立与newConnection()信号相关的槽函数:newClient(); 第五步:在槽函数中,调用nextPendingConnection()得到新的连接客户端对象

代码语言:javascript复制
QTcpSocket *QTcpServer::nextPendingConnection()

第六步:可以进行服务端和连接上客户端之间的数据传输:读和写 写操作:直接调用write写 读操作:当客户端写入数据过来时,连接上来的客户端也会发送一个信号:readyRead(),也建立与该信号相关的槽函数来完成从客户端读取数据

0 人点赞