进程间通信(IPC-Interprocess communication)是一组编程接口,能够让程序员协调不同的进程,使之能在一个操作系统里同时运行。这使得多个程序能够在同一时间里互相协作,共同完成用户的某项任务。
我们知道Qt可以通过QLocalSocket和QLocalServer来创建本地的TCP/IP,和其它进程进行通信。详细资料请查看博客:https://blog.csdn.net/liang19890820/article/details/50633819
#include "message.h" #include <QDebug>
Message::Message(QObject *parent) : QObject(parent) { m_socket = new QLocalSocket(this); m_server = new QLocalServer(this); m_server->listen("yike_ui"); m_server->setMaxPendingConnections(1); //设置最大允许连接数 connect(m_server, SIGNAL(newConnection()), this, SLOT(newConnectSlot())); } void Message::newConnectSlot() { c_socket = m_server->nextPendingConnection(); connect(c_socket, SIGNAL(readyRead()), this, SLOT(getMessage())); } void Message::getMessage() //作为服务器获取 { QByteArray msg = c_socket->readAll(); qDebug() << msg; } void Message::postMessage(QString target, QByteArray msg) //作为客户端发送 { m_socket->connectToServer(target); if(m_socket->waitForConnected(10)) { m_socket->write(msg); if(m_socket->waitForBytesWritten(10)) { m_socket->disconnectFromServer(); } else { qDebug("post message error"); } } else { qDebug("local server connect error"); } }
python也可以做本地的TCP/IP通信,详细资料请查看博客:https://blog.csdn.net/tenderzhe/article/details/79031087
import socket import os socket_server = "/tmp/yike_socket" server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) if os.path.exists(socket_server): os.unlink(socket_server) server.bind(socket_server) server.listen(1) print('1') while True: connection, address = server.accept() data = connection.recv(1024) print(data) connection.close()
这里有个问题是Qt其实是没有明确指定socket文件的位置的,listen()函数只是指定了监听地址的名字,这点曾让我很懵逼,实际测试发现其实我监听的yike_ui是生成在系统的/tmp目录下的,所以python中也得指定监听的socket文件地址在/tmp目录下。