ZeroC Ice 学习 <一> 基础

Ice 是一个开源的 RPC 框架, 支持 C++, C#, Java, JavaScript, Python, 以及更多的语言, 并且支持多种平台, 通过语言无关的 “Slice 语言” 来描述服务接口, 实现对象接口和实现分离的目的.

使用 ZeroC Ice 的基本步骤是:
1. 使用 slice 语言定义所需要的接口, 存为 .ice 文件
2. 通过 slice 编译器将 .ice 编译为对应语言的接口文件
3. 服务端实现生成的接口, 并且加入到 Ice 的 Adapter里
4. 客户端通过 3 生成接口文件来进行远程调用

官方文档里给出了多种语言的 Hello World 的例子.

由于最近在学习 kotlin, 所以也试着用 kotlin 来用了下.

一, 使用 slice 语言来定义 .ice 文件

module Demo
{
    interface IAdd
    {
        int add(int a, int b);
    }
}

此处定义了一个 Demo 模块, 以及一个 IAdd 接口, 一个方法 add(int, int)

二, 编译为 java 文件

slice2java --output-dir . Add.ice

将会生成 _IaddPrxI.java IAdd.java IAddPrx.java 三个文件, 服务端需要实现 IAdd, 而客户端需要的则是 IAddPrx.java 来获取代理

三, 实现服务端

服务端只需要继承 IAdd 接口, 并且重写 add 方法即可, 例如

import Demo.IAdd
import com.zeroc.Ice.Current

class Add : IAdd {
    override fun add(a: Int, b: Int, current: Current?): Int {
        return a + b;
    }
}

这只是 IAdd 的实现, 除此以外还要让服务端跑起来, 这部分很简单

import com.zeroc.Ice.Util.*

fun main(args: Array) {
    initialize(args).use {
        val adapter = it.createObjectAdapterWithEndpoints("SimpleAdapter", "default -p 10000")

        val addObj = Add()

        adapter.add(addObj, stringToIdentity("DemoAdd"))

        adapter.activate()

        it.waitForShutdown()
    }
}

首先调用 com.zeroc.Ice.Util.initialize 方法获取一个 Communicator 实例, 然后调用 它的 createObjectAdapterWithEndpoints 方法创建一个适配器, 第一个参数是适配器的名字, 第二个参数则表示用默认协议, 监听 10000 端口.

然后只需要实例化一个 Add 对象, 添加到适配器即可, adapter.add 的第二个参数需要传入一个 Identity, 只需要调用 stringToIdentity 方法即可.

最后激活适配器, 并让服务端一直启动, 等待结束

四, 客户端的实现

客户端就非常简单了

import com.zeroc.Ice.Util.*

fun main(args: Array) {
    initialize(args).use {
        val base = it.stringToProxy("DemoAdd:default -p 10000")

        val add = Demo.IAddPrx.checkedCast(base)

        println(add?.add(1, 2))
    }
}

同样需要先调用 com.zeroc.Ice.Util.initialize 方法获取一个 Communicator 实例, 再使用 stringToProxy 方法来获取一个对 DemoAdd 的代理, 也就是对服务端实现的 IAdd 的一个代理.

接着用 Demo.IAddPrx.checkedCast 对获取到的代理进行安全的转型, 转型成功后返回的就是可调用的 IAddPrx了, 如果失败了则返回了 null.

最后对获得的 add 代理调用 add 方法就可以进行远程调用了.

调用结果

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注