一、版本
Qt版本:Qt5.10_x64
Ice版本:3.7.4
二、效果
三、实现
1.服务端核心代码:
#pragma once
#include <QObject>
#include <Ice/Application.h>
class IceApp:public Ice::Application {
public:
IceApp();
~IceApp();
virtual int run(int argc, char* argv[])override;
};
#include "IceApp.h"
#include "TestPrinter.h"
#include "Printer.h"
#include <Ice/Ice.h>
#include <QDebug>
#include "QtGuiServer.h"
#include <QtWidgets/QApplication>
#include "LocalHost.h"
IceApp::IceApp() {
}
IceApp::~IceApp() {
}
int IceApp::run(int argc, char* argv[]) {
QString adpterStr = QString("tcp -h %1 -p 10002").arg(LocalHost::getLocalHostIP());
Demo::PrinterPrx printer;
try {
Ice::CommunicatorPtr&ic = communicator();
Ice::ObjectAdapterPtr objAdapter = ic->createObjectAdapterWithEndpoints("TestAdapter", adpterStr.toStdString());
Ice::ObjectPtr obj = new TestPrinter();
objAdapter->add(obj, ic->stringToIdentity("TestPrinter"));
objAdapter->activate();
#if 0
ic->waitForShutdown();
#endif
} catch (const Ice::Exception&ex) {
std::string err = ex.what();
qDebug() << QString::fromStdString(err);
}
QApplication a(argc, argv);
QtGuiServer w;
w.show();
return a.exec();
}
#include "IceApp.h"
int main(int argc, char *argv[])
{
#if 0
QApplication a(argc, argv);
QtGuiServer w;
w.show();
return a.exec();
#else
IceApp app;
return app.main(argc, argv);
#endif
}
2.客户端核心代码
#pragma once
#include <Ice/Application.h>
class IceClientApp:public Ice::Application {
public:
IceClientApp();
~IceClientApp();
virtual int run(int argc, char* argv[])override;
};
#include "IceClientApp.h"
#include <Ice/Ice.h>
#include <QString>
#include <QDebug>
#include "Printer.h"
#include "QtGuiClient.h"
#include <QtWidgets/QApplication>
static int count = 0;
IceClientApp::IceClientApp() {
}
IceClientApp::~IceClientApp() {
}
int IceClientApp::run(int argc, char* argv[]) {
#if 0
Demo::PrinterPrx printer;
try {
Ice::CommunicatorPtr ic = communicator();
Ice::ObjectPrx base = ic->stringToProxy("TestPrinter:tcp -h localhost -p 10002");
/*Demo::PrinterPrx */printer = Demo::PrinterPrx::checkedCast(base);
if (!printer) {
throw "Invalid Proxy!";
}
} catch (const Ice::Exception&ex) {
std::string err = ex.what();
qDebug() << QString::fromStdString(err);
}
std::string strCount = QString::number(++count).toStdString();
printer->printString(strCount + " Hello World!");
std::cout << printer->add(count, count) << std::endl;
#endif
QApplication a(argc, argv);
QtGuiClient w;
w.show();
return a.exec();
}
根据输入的服务器的IP地址连接服务器
#include "QtGuiClient.h"
#include <Ice/Ice.h>
#include <Ice/Application.h>
QtGuiClient::QtGuiClient( QWidget *parent)
: QMainWindow(parent) {
ui.setupUi(this);
init();
}
void QtGuiClient::init() {
connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(slotSendMsg()));
connect(ui.pushButtonConnect, SIGNAL(clicked()), this, SLOT(slotConnectServer()));
}
void QtGuiClient::slotConnectServer() {
QString strIp = QString("TestPrinter:tcp -h %1 -p 10002").arg(ui.lineEdit->text());
try {
Ice::CommunicatorPtr ic =Ice::Application::communicator();
Ice::ObjectPrx base = ic->stringToProxy(strIp.toStdString());
_printer = Demo::PrinterPrx::checkedCast(base);
if (!_printer) {
throw "Invalid Proxy!";
}
} catch (const Ice::Exception&ex) {
std::string err = ex.what();
}
}
void QtGuiClient::slotSendMsg() {
QString str = ui.textEditSend->toPlainText();
_printer->printString(str.toStdString());
}
aaa