ZeroC ICE之旅------多语言互通互联

Ice的服务端可以采用C++/Java/Python/C#等实现,客户端可以采用C++/Java/Python/C#/VB/PHP/Ruby来实现,就是说我的一个服务端采用C++实现,客户端可以采用java/php/vb/c# 等其他语言实现。

这个特性也是Ice的很重要的优势之一.

Ice的多语言之间如何确保对象的正确传输,每种语言都有各自的特点,数据类型,Ice是如何达到各种语言之间的互通互联的呢?
那么就一定提到Slice语言.Slice是保证各种语言的互通互联的关键,它是独立于其它任何语言,Ice可以通过把Slice代码片断转化为各自的

语言描述.


-rwxr-xr-x 1 system users 447888 2007-03-09 slice2java
-rwxr-xr-x 1 system users 67753 2007-03-09 slice2py
-rwxr-xr-x 1 system users 38679 2007-03-09 slice2rb
-rwxr-xr-x 1 system users 505441 2007-03-09 slice2vb
-rwxr-xr-x 1 system users 507119 2007-03-09 slice2cpp
-rwxr-xr-x 1 system users 454347 2007-03-09 slice2cs


赫赫够多!

Slice的全称:Specification Language for Ice,是Ice自己的特殊语言,一种用于使对象接口与其实现相分离的基础性抽象机制。Slice 建立在客户与服务器之间的合约,用以描述应用所使用的类型和对象接口。Slice描述独立于实现语言,所以客户实现语言是否与编写服务器所用的语言相同没有任何关系。

slice语言片段可以被编译为任何所支持语言的实现。目前Ice Slice可以支持映射到到C++, Java, C#, Python,Ruby, and PHP。
因为Slice主要对接口和类型的定义和描述,没有实现部分。

到底如何实现不同语言的互通互联的呢?我们已Java,C++作为Ice例子原形,实际上我们仅仅做少量修改,就可以实现

C++的服务端,Java的客户端。Server和Client还是保持在同一台机器上运行。注意我们基于同一个demo.ice的事例。

首先运行./Server,再运行Client,看到结果了么?赫赫,是不是出现了正常结果。

到目前没有我们所有实例都是基于同一台机器的,实际情况Server,Client会分布在不同机器上。这种情况下,我们需要如何处理呢?


这个很简单,在Server少量修改

Ice::ObjectAdapterPtr adapter = ic->createObjectAdapterWithEndpoints ("TestAdapter", "default -p 10000");


"default -p 10000" 采用 "tcp -h server1 -p port" 替代

Server所在主机IP:172.17.12.101 ,端口:10000

所以就修改为:tcp -h 172.17.12.101 -p 10000,再重新编译Server

#include <Ice/Ice.h>
#include <demo.h>
using namespace std;
using namespace Demo;
class Server:public test
{
public:
::std::string execute (const string & mth, const string & str,
const Ice::Current &);
public:
Server ();
};
Server::Server ()
{

};
std::string Server::execute (const string & mth, const string & str,
const Ice::Current &)
{
cout << mth + str << endl;
return mth + str;
}

int
main (int argc, char *argv[])
{
int
status = 0;
Ice::CommunicatorPtr ic;
try
{
ic = Ice::initialize (argc, argv);
Ice::ObjectAdapterPtr adapter
=
ic->createObjectAdapterWithEndpoints ("TestAdapter",
"tcp -h 172.17.12.101 -p 10000");
Ice::ObjectPtr object = new Server;
adapter->add (object, ic->stringToIdentity ("TestAdapter"));
adapter->activate ();
ic->waitForShutdown ();
} catch (const Ice::Exception & e)
{
cerr << e << endl;
status = 1;
} catch (const char *msg)
{
cerr << msg << endl;
status = 1;
}
if (ic)
{
try
{
ic->destroy ();
}
catch (const Ice::Exception & e)
{
cerr << e << endl;
status = 1;
}
}
return status;
}

编译方式参见:
[url]http://masterkey.iteye.com/blog/183307[/url]

下面我们需要对Client连接部分进行修改,同理:

Ice.ObjectPrx base = ic.stringToProxy("TestAdapter:tcp -h 172.17.12.101 -p 10000");


package Demo;

public class Client {
public static void main(String[] args) {
int status = 0;
Ice.Communicator ic = null;
try {
ic = Ice.Util.initialize(args);
// Ice.ObjectPrx base = ic
// .stringToProxy("SimplePrinter:tcp -h 172.17.12.101 -p 10000");
Ice.ObjectPrx base = ic
.stringToProxy("TestAdapter:tcp -h 172.17.12.101 -p 10000");

testPrx test = testPrxHelper.checkedCast(base);
if (test == null)
throw new Error("Invalid proxy");
System.out.println(test.execute("My first Ice ", "事例"));
//System.out.println("ok");
} catch (Ice.LocalException e) {
e.printStackTrace();
status = 1;
} catch (Exception e) {
System.err.println(e.getMessage());
status = 1;
}
if (ic != null) {
// Clean up
//
try {
ic.destroy();
} catch (Exception e) {
System.err.println(e.getMessage());
status = 1;
}
}
System.exit(status);
}
}

看到了么,就是这么简单,其他部分不用修改。

好了,我们进行验证,首先启动./Server,再执行Client ,看到了

"My first Ice 事例" 看到了么,祝贺你,跨语言的分布式调用例子你已经实现了。


其实Ice的通讯机制极其强大,支持集群和容错技术。关于集群的事例会在日后的文章中介绍。

BTW:

注意,Server运行之后监听于10000端口,需要修改iptables,允许其他机器可以连接。
编辑 iptables
vi /etc/sysconfig/iptables
追加:

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 10000 -j ACCEPT


ICE之轻量级分布式通讯中间件
[url]http://masterkey.iteye.com/blog/182954[/url]
ZeroC ICE之旅------C++
[url]http://masterkey.iteye.com/blog/183307[/url]
ZeroC ICE之旅------java
[url]http://masterkey.iteye.com/blog/182975[/url]
ZeroC ICE之旅------Slice
[url]http://masterkey.iteye.com/blog/184064[/url]
ZeroC ICE之旅------集群和容错
[url]http://masterkey.iteye.com/blog/185081[/url]
更多ICE文章,请关注:
Titan的天空
[url]http://masterkey.iteye.com[/url]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值