ICE中间件环境搭建

前言

本次搭建ICE中间件的环境对我来说还是比较艰辛的,一来是没有听过ICE中间件,连个初学者都算
不上,二来网上关于ICE的环境搭建少之又少,而且很多都是java的,而我需要搭建的是C++相关的。
不过好在功夫不负有心人,经过不断的琢磨,总算是把环境搭建好了并且运行demo,测试结果也符合预期。正好有时间,所以就把整个过程记录一下,也算是自己的一个小总结,也可以给正要搭建ICE环境的朋友们一个参考。

ICE简介

ICE是ZEROC官网的开源通信协议产品,它的全称是:The Internet Communications Engine,翻译为中文是互联网通信引擎,是一个面向对象的中间件,支持C++、Java、C#、VB、Python等,客户和服务器可以用不同的语言,可以运行在不同的操作系统和机器架构上,支持TCP/UDP。使我们能够以最小的代价构建分布式应用程序。ICE使我们专注于应用逻辑的开发,它来处理所有底层的网络接口编程,这样我们就不用去考虑这样的细节:打开网络连接、网络数据传输的序列化与反序列化、连接失败的尝试次数等。ICE的原理这里不做过多介绍,下面主要来讲一下搭建过程。

ICE安装过程详解(Windows端)

1.下载ICE安装包
ice下载链接下载Ice-3.7.3.msi。如果没有积分的小伙伴们,也可以上某宝找代下。
2.下载完成后,直接点击安装即可,安装过程中有选择是否将其添加到环境变量中,这里我没有选中,我自己手动添加的环境变量。
3.安装完成后应该可以看到有以下几个文件夹:
在这里插入图片描述
4.设置环境变量:需要设置的环境变量主要有以下:
ICE_HOME:ice的环境目录,例如我的安装目录是D:\Ice3.7.3,所以ICE_HOME就设置为D:\Ice3.7.3。
Path:%ICE_HOME%/bin;
classpath:%ICE_HOME%\lib\Ice.jar;%ICE_HOME%\lib\Freeze.jar;%ICE_HOME%\lib\db.jar;
5.环境变量设置完成之后,可以打开命令提示符(快捷键:window+R,然后输入cmd),然后输入icegridnode --version ,如果出现ice的版本号就说明安装正确了。如下:
在这里插入图片描述
6.打开Vstudio,这里以VS2019为例,先新建一个项目,选择控制台应用,取名为server。
7.建立好项目之后,需要安装ICE build等工具。在VS菜单栏点击工具->NuGet包管理器->管理解决方案的NuGet程序包,如下图:
在这里插入图片描述
8.在新的弹框中搜索ICE,如下:
在这里插入图片描述
因为vs2019对应的插件是V142版本的,所以得下载该版本的插件,选中第三步的项目,点击安装。
安装该插件之后,就会在项目路径中安装ice相关的头文件以及一些库。然后还有安装一个ice build插件,如下:
在这里插入图片描述
9.安装完两个插件之后,可以看到解决方案中多了一个slice文件夹,如下:
在这里插入图片描述
10.在编写程序之前先对该项目进行一些设置,主要设置链接库目录和头文件的目录。
在VS菜单栏点击项目->server属性:如下:
在这里插入图片描述
在项目属性界面中设置如下:
在这里插入图片描述
附加的包含目录怎么填呢?
在这里插入图片描述
在server的项目路径中找到packages,进入该目录后再点击zeroc.ice.v142.3.7.3->build->native->include. 找到这个include的路径,复制,填入上面的附加目录中
例如我的就是:C:\Users\12596\source\repos\server1\packages\zeroc.ice.v142.3.7.3\build\native\include
另外还要在链接器的选项中填入lib的目录:
在这里插入图片描述
我的lib目录:C:\Users\12596\source\repos\server1\packages\zeroc.ice.v142.3.7.3\build\native\lib
到这里项目属性就设置完成了,可以开始编写代码测试。
11.右键该文件,选择新建一个项,再选择slice文件,取名为Printer.ice.。如下:
在这里插入图片描述
12.在Printer.ice文件下输入如下内容:

module Demo
{
    interface Printer
    {
        void printString(string s);
    }
}

然后在命令提示符窗口cd 到Printer.ice文件所在的目录:执行 slice2cpp Printer.ice,此时会生成Printer.h和Printer.cpp如下:
在这里插入图片描述
没有错误的话,就不会有任何提示了。现在到项目文件看一下是否有上面所说的头文件和源文件呢。

在这里插入图片描述
如上图,可以看出这一步是没有问题的。
然后开始编写server.cpp

#include <Ice/Ice.h>
#include <Printer.h>

using namespace std;
using namespace Demo;

class PrinterI : public Printer
{
public:
    virtual void printString(string s, const Ice::Current&) override;
};

void 
PrinterI::printString(string s, const Ice::Current&)
{
    cout << s << endl;
}

int
main(int argc, char* argv[])
{
    try
    {
        Ice::CommunicatorHolder ich(argc, argv);
        auto adapter = ich->createObjectAdapterWithEndpoints("SimplePrinterAdapter", "default -p 10000");
        auto servant = make_shared<PrinterI>();
        adapter->add(servant, Ice::stringToIdentity("SimplePrinter"));
        adapter->activate();
        ich->waitForShutdown();
    }
    catch(const std::exception& e)
    {
        cerr << e.what() << endl;
        return 1;
    }
    return 0;
}

注意:如代码中的#include <Printer.h>改成 #include “Printer.h” 因为该头文件就在项目目录下,所以用" "的形式就会在当前目录下去查找文件了。
13.在编译之前,还需要修改一下Printer.cpp的代码,如下:
在这里插入图片描述
14.直接编译,会在项目的Debug目录下生成server的可执行文件,如果我们点击该可执行文件,可以发现会提示缺少XXX.dll文件,为此我们需要把动态库全部拷贝过来就可以了。动态库的路径为:
项目路径\packages\zeroc.ice.v142.3.7.3\build\native\bin\Win32\Debug。
再次点击server.exe文件就可以执行了。
事实上点击server.exe,DOS窗口是什么都没有的,因为我们还需要再写一个client程序,去调用printString的方法。
15.同样的,再使用VS创建名为client的项目,同样选择控制台应用。
client代码如下:

#include <Ice/Ice.h>
#include <Printer.h>
#include <stdexcept>
 
using namespace std;
using namespace Demo;
 
int
main(int argc, char* argv[])
{
    try
    {
        Ice::CommunicatorHolder ich(argc, argv);
        auto base = ich->stringToProxy("SimplePrinter:default -p 10000");
        auto printer = Ice::checkedCast<PrinterPrx>(base);
        if(!printer)
        {
            throw std::runtime_error("Invalid proxy");
        }
 
        printer->printString("Hello World!");
    }
    catch(const std::exception& e)
    {
        cerr << e.what() << endl;
        return 1;
    }
    return 0;
}

编译client的所有步骤都和server是一样的:总结一下就是:
1.为项目安装两个插件,同时设置项目属性
1.创建ice文件,使用slice2cpp 命令生成源文件和头文件,修改#include<Printer.h>为include “Printer.h”
2.创建client.cpp代码 修改#include<Printer.h>为include “Printer.h”
3.编译生成client.exe。然后所有的动态库拷贝到client.exe文件同一目录下。

当client和server的可执行文件都准备好之后就可以开始测试。
测试方法是先执行server.exe,然后执行client.exe,再回到server.exe生成的DOS窗口中可以看到打印了hello world。

至此,整个ICE环境可以说就搭建好了。下篇我再写一篇关于ubuntu下搭建ICE的环境,并且实现server端放在windows,client端放在ubuntu上来实现远程过程调用。

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值