1、linux下源码编译安装ice3.4.2,
参考帖子:
http://www.php230.com/compile-and-install-linux-environment-ice.html
http://blog.csdn.net/wxl1986622/article/details/7005031
注意:java版本安装时,如果报错put()函数冲突,找到/opt/Ice-3.4.2/java/src/IceInternal/OutgoingConnectionFactory.java, 修改内部类MultiHashMap的put()函数的函数名为put_aaa(),把用到put()函数的put改成put_aaa()。_connections和_connectionsByEndpoint这两对象的put方法改名。重新make即可
2、准备Eclipse和JDK环境
3、安装Ice for Eclipse插件(Eclipse里傻瓜安装)
http://www.51testing.com/html/01/610901-851751.html
http://www.ithao123.cn/content-553523.html
大致的流程是:
1、ice开发从写slice接口开始。
2、用iceBuilder插件在eclipse中生成java端的代码
3、实现MyServiceImpl,MyServerStarter和MyClient类。
参考帖子:http://www.tuicool.com/articles/3MnU32
一个例子:
1、写接口myservice.ice:
[["java:package:com.my"]]
module demo{
interface MyService{
string hello();
};
};
2、用iceBuilder插件在eclipse中生成ice的各种类。
3、写服务端代码MyServiceImpl:
package service;
import com.my.demo._MyServiceDisp;
import Ice.Current;
public class MyServiceImpl extends _MyServiceDisp{
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public String hello(Current __current) {
return "Hello World";
}
}
4、写服务的启动类:
package service;
public class MyServiceStarter {
public static void main(String[] args){
int status = 0;
Ice.Communicator ic = null;
try{
ic = Ice.Util.initialize(args);
Ice.ObjectAdapter adapter = ic.createObjectAdapterWithEndpoints("MyServiceAdapter", "default -p 10000");
MyServiceImpl servant = new MyServiceImpl();
adapter.add(servant, Ice.Util.stringToIdentity("MyService"));
adapter.activate();
System.out.print("server started.");
ic.waitForShutdown();
} catch(Exception e){
e.printStackTrace();
status = 1;
} finally{
if(ic != null){
ic.destroy();
}
}
System.exit(status);
}
}
5、写客户端代码
package service;
import com.my.demo.MyServicePrx;
import com.my.demo.MyServicePrxHelper;
public class MyClient {
public static void main(String[] args){
int status = 0;
Ice.Communicator ic = null;
try{
ic = Ice.Util.initialize(args);
Ice.ObjectPrx base = ic.stringToProxy("MyService:default -p 10000");
MyServicePrx prxy = MyServicePrxHelper.checkedCast(base);
if(prxy == null){
throw new Error("Invaild proxy.");
}
String rt = prxy.hello();
System.out.println(rt);
}catch(Exception e){
e.printStackTrace();
status = 1;
} finally{
if(ic != null){
ic.destroy();
}
}
System.exit(status);
}
}
服务端:ice Object、servant和Object Adapter
客户端:ice Proxy
endPoint(端点):由服务端所使用的通信协议、IP地址、端口等组成,如:default -p 10000 -h 192.168.1.88
Proxy有Direct Proxy和Indirect Proxy两种,Direct Proxy是Proxy直接绑定某远端的Object的访问地址如SimplePrinter:default -p 10000;Indirect Proxy是通过寻址服务Location Service来获取IceObject的通信地址后,再于IceObject进行连接。写法如:SimplePrinter@PrinterAdapter
Ice.Current:记录网络连接上下文信息
Ice.Internal.Incoming:RPC网络通道
communicator:处理通信实现RPC
IceBox就像Tomcat一样,用配置文件去描述服务的各种配置,启动Ice服务框架。
serviceImpl实现类除了继承_MyServiceDisp类外,还要implements IceBox.Service接口
Reference:
1. ZeroCIce权威指南 / Leader-us著. –北京:电子工业出版社,2015.6