12: 多语言互通互联
来源:互联网 发布:中国自然保护区数据库 编辑:程序博客网 时间:2024/05/01 09:00
Ice的服务端可以采用C++/Java/Python/C#等实现,客户端可以采用C++/Java/Python/C#/VB/PHP/Ruby来实现,
就是说我的一个服务端采用C++实现,客户端可以采用java/php/vb/c# 等其他语言实现。
这个特性也是Ice的很重要的优势之一.
Ice的多语言之间如何确保对象的正确传输,每种语言都有各自的特点,数据类型,Ice是如何达到各种语言之间的互通互联的呢?
那么就一定提到Slice语言.Slice是保证各种语言的互通互联的关键,它是独立于其它任何语言,Ice可以通过把Slice代码片断转化为各自的
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;
- }
下面我们需要对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
0 0
- 12: 多语言互通互联
- 互联网互联互通
- VLAN互联互通
- 标准化开启互联互通
- jms之MQ的互联互通
- 互联网-互联互通网-电信增值
- jms之MQ的互联互通
- 目前市场主流互联互通解决方案有三种
- alljoyn解决互联互通问题
- BGP专线 解决南北互联互通
- 电信、网通南北网络互通互联解决方案
- 电子政务互联互通软件平台的体系架构
- 铁通遭遇更隐蔽互联互通障碍
- 民建IT小组提案:互联网互联互通要立法
- 杨叙:未来MeeGo将成为互联互通生态平台
- 城市一卡通系统集成商互联互通资质认定全面展开
- 在VMware Workstation中使多个LAN segment互联互通
- 嵌入式互联互通技术 ---- RapidIO 总线技术介绍
- maven安装jar包到本地仓库报的一个错误:Could not find goal '' in plugin org.apache.maven.plugins
- QLPreviewController的使用
- 《卡尔曼滤波原理及应用-MATLAB仿真》程序-5.2UKF
- SQL中IN,LIMIT,唯一
- hdu2092整数解
- 12: 多语言互通互联
- java csv 导入操作
- 计算主格扩展出来的所有奇数列的和
- 单例设计模式
- WebRTC学习之一:开篇
- 平凡而又神奇的贝叶斯方法
- java的堆栈
- SQLITE3的C接口
- css浮动事例