Qt调用Ice实现一对一通信

一、版本

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wb175208

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值