Ice不介绍了,http://www.zeroc.com/
Ruby不介绍了。
来,我试试啊,步骤我会清楚的记录下来,
一来肯定让不会的人学会,
二来我怕我自己忘了,这两天大脑缺氧,只能记住三天内的事情。。。。。。
下载Ice-3.3.0-VC60.msi
[url]http://www.zeroc.com/download/Ice/3.3/Ice-3.3.0-VC60.msi[/url]
ICE从3.1.1开始就支持Ruby了,动态语言还支持Python、php。
下载后安装,略过。
安装好后请打开安装目录,仔细阅读《README.txt》,如果你觉得阅读英文太累又不想走弯路,那就请你仔细阅读本博客。
首先,Ice3.3.0支持的Ruby是1.8.6,请确认。
其次,README.txt中说道:
[quote]“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%”[/quote]
所以请在你的环境变量中设置/增加如上两项,别写错!!!
环境变量搞定了么?搞定了请你掏出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服务端的那个简单接口是他写的。
写完了。