• ICE介绍及实例


    Ice-Internet Communications Engine,是一种面向对象、跨平台、多语言的通信中间件。支持C++、Java、C#、VB、Python等,客户和服务器可以用不同的语言,可以运行在不同的操作系统和机器架构上,支持TCP/UDP。

    Ice应用组成:

    Ice对象——Ice对象是在本地或远地的地址空间中、能响应客户请求的实体。先由Slice定义,然后编译成特定语言版本;每个Ice对象有多个接口,支持特定操作,客户通过调用它的接口来发出请求;每个对象有唯一的对象标识。

    Servants——服务器端编写的类实例,体现Ice对象行为。

    代理(Proxies)——代理是Ice对象在客户端的代表,客户调用代理上的操作来获得服务端上Ice对象提供的服务。

    通信器(Ice::Communicator)——通信时,服务器和客户建立一个通信器,为通信进程分配和管理资源,是双方通信的专用线路。

    对象适配器(object adapter)——专用于服务器端的Ice API,把Ice run time与服务端编写的Servant类连接在一起。每个适配器绑定一个端口。

    Ice应用的结构如下:


    Slice

    Slice (Specification Language for Ice, Ice规范语言),用于对象接口定义与实现相分离的基础性抽象机制,可以把定义好的Ice对象映射成特定语言。

    Slice开发过程见下图:

    相同开发环境


    不同开发环境:


    Ice应用开发过程:

    1. 定义Ice对象(Printer.ice)

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


    2. 编译成C++

    slice2cpp Printer.ice

    获得Printer.h/Printer.cpp

    3.服务端使用C++实现Ice对象(Servant类)

    #include <Ice/Ice.h>
    #include <Printer.h>
    using namespace std;
    using namespace Demo;
    class PrinterI:public Printer{
    public:
       virtual void printString(const string& s,const Ice::Current&);
    };
    void PrinterI::printString(const string& s, const Ice::Currrent&){
    cout<<s<<endl;
    }
    


    4.服务端编写

    Ice::CommunicatorPtr ic;
    //建立通信器
    ic=Ice::initialize(argc, argv);
    //建立对象适配器,绑定端口
    Ice::ObjectAdapterPtr adapter=ic->createObjectAdapterWithEndpoints(
    		"simplePrinterAdapter","default -p 10000");
    Ice::ObjectPtr object = new PrinterI;
    //加入Ice对象实例,指定标识符
    adapter->add(object,ic->stringToIdentity("SimplePrinter"));
    //启动适配器
    adapter->activate();
    //挂起该进程
    ic->waitForShutdown();


    5.客户编写

    #include <Ice/Ice.h>
    #include <Printer.h>
    using namespace std;
    using namespace Demo;
    Ice::CommunicatorPtr ic;
    //建立通信器
    ic = Ice::initialize(argc, argv);
    //获得Ice对象代理,SimplePrinter-对象标识符,default -p 10000-协议与端口
    Ice::ObjectPrx base = ic->stringToProxy("SimplePrinter:default -p 10000");
    //向下转换
    PrinterPrx printer = PrinterPrx::checkedCast(base);
    if (!printer) throw "Invalid proxy";
    //调用操作
    printer->printString("Hello World!");


    6.编译

    //服务端
    c++ -I. -I$ICE_HOME/include -c Printer.cpp Server.cpp
    c++ -o server Printer.o Server.o -L$ICE_HOME/lib -lIce -lIceUtil
    //客户端
    c++ -I. -I$ICE_HOME/include -c Printer.cpp Client.cpp
    c++ -o client Printer.o Client.o -L$ICE_HOME/lib -lIce -lIceUtil


    7.运行

    服务器端./server,客户端./client


  • 相关阅读:
    Hashcode的作用
    java 强弱软虚 四种引用,以及用到的场景
    Object类有哪些公用方法?
    equals和==的区别
    switch能否用string做参数
    Java九种基本数据类型,以及他们的封装类
    Singleton(Java)
    快速排序和二分查找(Javascript)
    快速排序和二分查找(Go)
    ubuntn 安装 MySQL
  • 原文地址:https://www.cnblogs.com/whuqin/p/4982046.html
Copyright © 2020-2023  润新知