浏览 2368 次
锁定老帖子 主题:[入门]用Ruby调用ICE接口
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-12-31
最后修改:2009-03-30
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服务端的那个简单接口是他写的。 写完了。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |