栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

qt 与 python 基于命名管道的进程间通信示例

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

qt 与 python 基于命名管道的进程间通信示例

文章目录
  • qt 与 python 基于命名管道的进程间通信示例
    • 概述
    • 示例说明
    • 服务器端程序设计(Qt)
      • 工程配置文件
      • mainwindow.h
      • mainwindow.cpp
    • 客户端程序设计(Python)

qt 与 python 基于命名管道的进程间通信示例 概述

“命名管道(Named Pipes)”是一种简单的进程间通信(IPC)机制,Microsoft Windows大都提供了对它的支持(但不包括Windows CE)。命名管道可在同一台计算机的不同进程之间或在跨越一个网络的不同计算机的不同进程之间,支持可靠的、单向或双向的数据通信。推荐用命名管道作为进程通信方案的一项重要的原因是它们充分利用了Windows内建的安全特性(ACL等)。
用命名管道来设计跨计算机应用程序实际非常简单,并不需要事先深入掌握底层网络传送协议(如TCP、UDP、IP、IPX)的知识。这是由于命名管道利用了微软网络提供者(MSNP)重定向器通过同一个网络在各进程间建立通信,这样一来,应用程序便不必关心网络协议的细节。(–摘自百度百科)

Qt中 QLocalSocket通过命名管道实现, 因此可以使用QLocalSocket和QLocalServer实现Qt端的命名管道通信.

示例说明

示例程序已上传至CSDN, 点击localserver.zip进行下载.

使用 Qt Creator 打开服务器端示例工程localserver并运行.运行效果如下图所示.

Test按钮为禁用状态, 表明客户端未连接. 状态栏显示管道名称.

在工程目录下打开cmd或powershell, 运行客户端Python脚本:

python  .localclient.py

此时, 服务器端界面中Test按钮变为启用状态, 点击Test按钮, 服务器端将发送消息’Hello, Python.'到客户端, 客户端收到服务端发来的消息后,将输出至终端并返回消息"Hello, Qt".

服务器端收到客户端返回的消息后,将显示在文本框中. 运行效果如下:

服务器端程序设计(Qt) 工程配置文件

链接network模块

QT       += core gui network
mainwindow.h

添加槽函数声明:

槽函数说明
newConnection()客户端连接服务器端时,执行此方法;
disconnected()客户端断开连接时,执行此方法;
readData()接收到客户端发送的数据时, 执行此方法
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
class QLocalServer;
class QLocalSocket;
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    ...
private slots:
    void on_pushButton_clicked();
    /// 客户端连接服务器端时.
    void newConnection();
    /// 客户端断开连接时.
    void disconnected();
    /// 接收到客户端发送的数据时
    void readData();

private:
    Ui::MainWindow *ui;
    QLocalServer *server;
    QLocalSocket *clientConnection;
};
#endif // MAINWINDOW_H
mainwindow.cpp

包含必要的头文件:

// mainwindow.cpp
#include 
#include 

构造函数:

  • 实例化QLocalServer,
  • 连接server的newConnection()信号
MainWindow::MainWindow(QWidget *parent) ...
{
    ...
    server = new QLocalServer(this);
    ...
    connect(server, &QLocalServer::newConnection, this, &MainWindow::newConnection);
}

newConnection() :

  • 获取客户端连接clientConnection
  • 连接clientConnection的readyRead()信号
  • 连接clientConnection的disconnected()信号
  • 启用按钮
void MainWindow::newConnection()
{
    clientConnection = server->nextPendingConnection();
    connect(clientConnection, &QLocalSocket::readyRead, this, &MainWindow::readData);
    connect(clientConnection, &QLocalSocket::disconnected, this, &MainWindow::disconnected);
    ui->pushButton->setEnabled(true);
}

readData() :

  • 从clientConnection读取数据;
  • 追加数据到文本框.
void MainWindow::readData()
{
    char buf[1024] = {0};
    clientConnection->read(buf, 1024);
    QString msg(buf);
    ui->plainTextEdit->appendPlainText(msg);
}

disconnected():

  • 删除连接
  • 禁用按钮
void MainWindow::disconnected()
{
    clientConnection->deleteLater();
    ui->pushButton->setEnabled(false);
}

on_pushButton_clicked():

  • 向客户端发送数据
void MainWindow::on_pushButton_clicked()
{
    char *data = "hello, Python.";
    clientConnection->write(data);
}
客户端程序设计(Python)
import os

try:
    fd = os.open('\\.\pipe\fortune', os.O_RDWR)
except FileNotFoundError:
    print('Error: Server not running, or pipe name dismatch.')
    raise FileNotFoundError
    
print('Wait recv...')

for k in  range(10):
    data = os.read(fd, 1024)
    print(data)
    d = b'Hello, Qt.'
    os.write(fd, d)

os.close(fd)
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/313374.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号