跟随Fortune Client示例。
创建一个QLocalServer
的子类,使用QProcess
启动另一个应用程序(客户端),并且该客户端将使用QLocalSocket
发送一些消息。在主(服务器)应用程序中,只有来自客户端的第一条消息才会出现,而且仅在客户端进程退出时才会出现。
服务器应用:
localserver.h
#ifndef LOCALSERVER_H
#define LOCALSERVER_H
#include <QLocalServer>
class LocalServer : public QLocalServer
{
Q_OBJECT
public:
explicit LocalServer(QObject* prnt = nullptr);
};
#endif // LOCALSERVER_H
localserver.cpp
#include "localserver.h"
#include <QLocalSocket>
#include <QDebug>
LocalServer::LocalServer(QObject* prnt)
: QLocalServer(prnt)
{
connect(this, &QLocalServer::newConnection, this, [&]() {
qDebug() << "Socket connected";
QLocalSocket* socket = this->nextPendingConnection();
connect(socket, &QLocalSocket::disconnected, socket, &QLocalSocket::deleteLater);
connect(socket, &QLocalSocket::readyRead, [&, socket]() {
qDebug() << socket->readAll();
});
});
}
主要代码文件.cpp(服务器)
#include <QCoreApplication>
#include <QProcess>
int main(int argc, char* argv[])
{
QCoreApplication a(argc, argv);
LocalServer::removeServer("testServer");
LocalServer server;
if (server.listen("testServer")) {
QProcess process;
process.setProgram("/home/ram/work/build/QtExamples/build-LocalSocketClient-Qt_5_12_1_Desktop-Debug/LocalSocketClient");
process.start();
if (process.waitForStarted() && process.waitForFinished()) {
a.exit(0);
}
}
return a.exec();
}
客户端应用:
主文件.cpp(客户端)
#include <QCoreApplication>
#include <QLocalSocket>
#include <QTimer>
#include <QDebug>
int main(int argc, char* argv[])
{
QCoreApplication a(argc, argv);
QLocalSocket localSocket;
QObject::connect(&localSocket, &QLocalSocket::connected, &localSocket, []() {
qDebug() << "Socket connected";
});
localSocket.setServerName("testServer");
localSocket.connectToServer();
if (localSocket.waitForConnected()) {
qDebug() << "Connected!";
auto timer = new QTimer(qApp);
QObject::connect(timer, &QTimer::timeout, &localSocket, [&localSocket]() {
static int msgCount(0);
QString msg(QString("Message from client %1").arg(++msgCount));
qDebug() << localSocket.write(msg.toLatin1()) << msg;
if (msgCount > 5) {
qApp->exit(0);
}
});
timer->start(1000);
} else {
return 1;
}
return a.exec();
}
当我分别运行两个应用程序时,即在服务器应用程序的
main.cpp
中没有QProcess
部分时,我会看到以下输出。Socket connected
"Message from client 1"
"Message from client 2"
"Message from client 3"
"Message from client 4"
"Message from client 5"
使用QProcess
时,这五条消息会同时出现。
Socket connected
"Message from client 1Message from client 2Message from client 3Message from client 4Message from client 5"
我有遗漏的吗?QProcess
需要更多信息吗?
此外,我也尝试了使用 system()
函数 - 它的表现相同。
QTimer
实例之一会遮盖另一个。你正在使用的那个将在调用timer.start
后立即超出范围并被销毁。 - G.M.connect(timer, ...
更改为connect(&timer, ...
。 - eyllanescif (cient.waitForStarted() &&
更改为if (client.waitForStarted() &&
。 - eyllanesc