qt与python基于命名管道的进程间通信⽰例
⽂章⽬录
qt 与 python 基于命名管道的进程间通信⽰例
概述松散
“命名管道(Named Pipes)”是⼀种简单的进程间通信(IPC)机制,Microsoft Windows⼤都提供了对它的⽀持(但不包括Windows CE)。命名管道可在同⼀台计算机的不同进程之间或在跨越⼀个⽹络的不同计算机的不同进程之间,⽀持可靠的、单向或双向的数据通信。推荐⽤命名管道作为进程通信⽅案的⼀项重要的原因是它们充分利⽤了Windows内建的安全特性(ACL等)。
⽤命名管道来设计跨计算机应⽤程序实际⾮常简单,并不需要事先深⼊掌握底层⽹络传送协议(如TCP、UDP、IP、IPX)的知识。这是由于命名管道利⽤了微软⽹络提供者(MSNP)重定向器通过同⼀个⽹络在各进程间建⽴通信,这样⼀来,应⽤程序便不必关⼼⽹络协议的细节。(–摘⾃)
Qt中 QLocalSocket通过命名管道实现, 因此可以使⽤QLocalSocket和QLocalServer实现Qt端的命名管道通信.
⽰例说明
⽰例程序已上传⾄CSDN, 点击进⾏下载.
使⽤ Qt Creator 打开服务器端⽰例⼯程localrver并运⾏.运⾏效果如下图所⽰.
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_Hcerel
#include<QMainWindow>
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();
/// 客户端断开连接时.
impresdvoid disconnected();
/// 接收到客户端发送的数据时
void readData();
private:
Ui::MainWindow *ui;
QLocalServer *rver;
QLocalSocket *clientConnection;
agricultural};
#endif// MAINWINDOW_H
mainwindow.cpp
包含必要的头⽂件:
// mainwindow.cpp
#include<QLocalServer>
#include<QLocalSocket>
构造函数:
实例化QLocalServer,
连接rver的newConnection()信号
MainWindow::MainWindow(QWidget *parent)...
{
<
rver =new QLocalServer(this);
...
connect(rver,&QLocalServer::newConnection,this,&MainWindow::newConnection); }
newConnection() :
获取客户端连接clientConnection
ares是什么意思连接clientConnection的readyRead()信号
连接clientConnection的disconnected()信号
启⽤按钮
void MainWindow::newConnection()
{
clientConnection = rver->nextPendingConnection();
connect(clientConnection,&QLocalSocket::readyRead,this,&MainWindow::readData); connect(clientConnection,&QLocalSocket::disconnected,this,&MainWindow::disconnected); ui->pushButton->tEnabled(true);
}
readData() :
从clientConnection读取数据;
追加数据到⽂本框.
void MainWindow::readData()
{
char buf[1024]={0};
clientConnection->read(buf,1024);
QString msg(buf);
ui->plainTextEdit->appendPlainText(msg);
}
disconnected():
删除连接
in your eyes歌词
禁⽤按钮
void MainWindow::disconnected()
{
clientConnection->deleteLater();
ui->pushButton->tEnabled(fal);
}
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.') rai FileNotFoundError
print('')
certainty
for k in range(10):
data = os.read(fd,1024)
print(data)
d =b'Hello, Qt.'
os.write(fd, d)
os.clo(fd)