[入门]用Ruby调用ICE接口

Ice不介绍了,http://www.zeroc.com/
Ruby不介绍了。

来,我试试啊,步骤我会清楚的记录下来,
一来肯定让不会的人学会,
二来我怕我自己忘了,这两天大脑缺氧,只能记住三天内的事情。。。。。。


下载Ice-3.3.0-VC60.msi

http://www.zeroc.com/download/Ice/3.3/Ice-3.3.0-VC60.msi

ICE从3.1.1开始就支持Ruby了,动态语言还支持Python、php。

下载后安装,略过。

安装好后请打开安装目录,仔细阅读《README.txt》,如果你觉得阅读英文太累又不想走弯路,那就请你仔细阅读本博客。

首先,Ice3.3.0支持的Ruby是1.8.6,请确认。
其次,README.txt中说道:
引用“You also need to add the Ice bin directory to your PATH, for example:

set PATH=<Ice installation root directory>\bin;%PATH%

Finally, set RUBYLIB so that the Ruby interpreter is able to load
the Ice extension:

set RUBYLIB=<Ice installation root directory>\ruby;%RUBYLIB%”

所以请在你的环境变量中设置/增加如上两项,别写错!!!

环境变量搞定了么?搞定了请你掏出irb试试,

win+r->cmd->irb:
require 'rubygems'
require 'Ice'



这两个require执行完后如果都是成功,那恭喜你,Ice的ruby工作环境已经搞定。

Ice怎么工作的我也不说了,服务端接口开发好后,用.ice文件描述一下接口和数据格式,然后将这个.ice文件给客户端,客户端可以用slice2****去转换成相应语言的接口文件,加载进去就可以使用和服务器端约定好的接口和数据了。

这篇文章主要是说客户端怎么使用ruby调用服务器端的接口,所以服务器端怎么实现我们就不管了,我把服务器端的主要代码给大家看一眼大家就明白了,大家都比我聪明的哦!

下面是服务端的主要代码,

/*这段代码是启动Ice的,都是套路的东西*/
	Ice::ObjectAdapterPtr adapter = ic->createObjectAdapterWithEndpoints("WGSrv","default -p 7788");
//服务器端口是7788
	Ice::ObjectPtr object = new CTestIceImpl();
	adapter->add(object, ic->stringToIdentity("WGInterfaceAgentId"));
	//这句重要,约定了一个身份证一样的东西,客户端用的,用来判断客户端调用的是服务器的哪个ice接口。
	adapter->activate();

	std::cout << "now server start successfully." << std::endl;

	ic->waitForShutdown();



/*这段代码是服务器端接口的实现,
*我这里选择了一个ping的接口给大家看,
*我们可以看到这个ping除了向终端(服务器端)输出"ping successfully."这个字符串之外,
*就是返回个0,之外就没做什么,很简单。
*/
	int ping(const Ice::Current& = Ice::Current())
	{
		std::cout << "ping successfully." << std::endl;
		return 0;
	}



上面都是服务器的东西,下面是Ruby访问这个接口的方法:

<<COMMENT
这里面的东西几乎全部是套路,需要实现的代码请放到别的地方,需要的时候加载进来。
COMMENT
require 'Ice'
Ice::loadSlice('testice.ice')#服务端给你的.ice在这里用到了!

status = 0
ic = nil
begin
    ic = Ice::initialize(ARGV)
    base = ic.stringToProxy("WGInterfaceAgentId:default -p 7788 -h 10.2.226.8")
#上面这句,请注意服务器端对应的一句之一“adapter->add(object, ic->stringToIdentity("WGInterfaceAgentId"));”
#上面我们提到过"WGInterfaceAgentId"这个字符串是用来辨别目的地接口的,现在用到了哦。
    pinger = WG::WGTestIcePrx::checkedCast(base)
    if not pinger
        raise "Invalid proxy"
    end

    pinger.ping()#只有这句最有用,其它的都是套路。
rescue
    puts $!
    puts $!.backtrace.join("\n")
    status = 1
end

if ic
    # Clean up
    begin
        ic.destroy()
    rescue
        puts $!
        puts $!.backtrace.join("\n")
        status = 1
    end
end

exit(status)



执行一下,成功。

我没仔细研究过ICE,以前也从没用过这东西,这是第一次用,看了下ZeroC的文档,请教了朋友,才完成调用,但还有个问题我不明白,Ice提供了一个工具是slice2****,这个工具对于静态语言来说是用来转换.ice文件到对方语言的,但我用动态语言比如Ruby调用Ice接口的时候,我发现即便我把这个slice2rb生成的文件文件删掉也无所谓,照样调用通过,我想这可能是利用了动态语言无需声明定义的特点吧,看来用Ruby调用Ice接口实在是太方便了!!

临了,要感谢我的哥们:王冠同学,Ice服务端的那个简单接口是他写的。

写完了。

转载:http://www.verydemo.com/demo_c119_i206.html

你可能感兴趣的:(Ruby)