本文将结合实际项目,做一个基于ice的实际项目实例应用,该实例完成客户端调用服务端接口完成消息发送,计算的功能。
1,创建java项目ICEServer,导入ice.jar.
2,在项目下创建slice文件夹,编写model.ice,service.ice,service2.ice文件,其内容如下
model.ice
#ifndef _MODEL
#define _MODEL
module com
{
module alan
{
module generated
{
module model
{
/**定义整型数组**/
sequence<int> IntegerArray;
/**自定义Map类型**/
dictionary<string, string> CustomMap;
/**消息类型**/
enum MessageType {ERROR,INFO,WARNING};
/**计算操作类型**/
enum CalcType {Adds,Subtract,Multiply,Divide};
/**消息的操作类型**/
enum ActionType {Add,Remove,Stop,Start,Pause};
/** 消息结构 **/
["java:getset"]
struct Message {
/**消息类型**/
MessageType type;
/**消息类型**/
ActionType action;
/**相关id**/
IntegerArray relatedIds;
/**扩展属性**/
CustomMap extention;
};
};
};
};
};
#endif
service.ice
#ifndef _GENERATED
#define _GENERATED
#include <model.ice>
module com
{
module alan
{
module generated
{
interface MessageServiceIce
{
/**
* 向ice服务发送信息
* @param message 消息内容
* @return true 成功 false 失败
*/
string sendMessage(model::Message msg);
};
};
};
};
#endif
service2.ice
#ifndef _GENERATED
#define _GENERATED
#include <model.ice>
module com
{
module alan
{
module generated
{
interface CalcServiceIce
{
/**
* 服务端计算方法
* @param d1 计算数1
* @param d2 计算数2
* @param type 计算方式
* @return true 成功 false 失败
*/
double calc(double d1, double d2, model::CalcType cal);
};
};
};
};
#endif
3.dos环境下执行
cd E:\workspace\ICEService\slice
E:\Ice-3.3.0\bin\slice2java -I. --output-dir=../src *.ice //生产代码
E:\Ice-3.3.0\bin\slice2html -I. --output-dir=doc *.ice//生产doc文档,可以忽略
将生产generated包下代码以jar包方式导出icetest.jar,并在项目中建立lib目录放入其中(把ice.jar也放入lib下,以备后用),可以删除其生产代码,以jar方式调用其代码。
4,编写发布接口实现代码和服务器端代码
CalcServiceIceImpl .java实现数学计算:
public class CalcServiceIceImpl extends _CalcServiceIceDisp {
public double calc(double num1, double num2, CalcType type,
Current arg3) {
double re = 0.0d;
switch (type) {
case Adds:
re = num1 + num2;
break;
case Subtract:
re = num1 - num2;
break;
case Multiply:
re = num1 * num2;
break;
case Divide:
re = num1 / num2;
break;
default:
break;
}
return re;
}
}
MessageServiceIceImpl .java实现发送消息
public class MessageServiceIceImpl extends _MessageServiceIceDisp {
public String sendMessage(Message msg, Current __current) {
String str = msg.getType() +" "+ msg.getAction()+" " + Arrays.toString(msg.getRelatedIds());
return str;
}
}
IceService .java实现服务器端接口注册:
public class IceService {
public static void main(String[] args){
int status = 0;
Communicator ic = null;
try{
ic = Ice.Util.initialize(args);
Ice.ObjectAdapter adapter = ic.createObjectAdapterWithEndpoints("testAdapter", "default -h *");
ObjectImpl object1 = new MessageServiceIceImpl();
ObjectImpl object2 = new CalcServiceIceImpl();
adapter.add(object1, ic.stringToIdentity("messageService"));
adapter.add(object2, ic.stringToIdentity("calcService"));
adapter.activate();
ic.waitForShutdown();
} catch (Ice.LocalException e) {
e.printStackTrace();
status = 1;
} catch (Exception e) {
System.err.println(e.getMessage());
status = 1;
}
if (ic != null) {
try {
ic.destroy();
} catch (Exception e) {
System.err.println(e.getMessage());
status = 1;
}
}
System.exit(status);
}
}
5,发布接口
在项目下创建deploy文件夹,在其下创建config-ice.grid配置文件
IceGrid.InstanceName=IceTestServiceGrid
#
# The IceGrid locator proxy.
#
Ice.Default.Locator=IceTestServiceGrid/Locator:tcp -p 10000
#
# IceGrid registry configuration.
#
IceGrid.Registry.Client.Endpoints=tcp -p 10000
IceGrid.Registry.Server.Endpoints=tcp
IceGrid.Registry.Internal.Endpoints=tcp
IceGrid.Registry.Data=db/rescenter_registry
IceGrid.Registry.PermissionsVerifier=IceTestServiceGrid/NullPermissionsVerifier
IceGrid.Registry.AdminPermissionsVerifier=IceTestServiceGrid/NullPermissionsVerifier
IceGrid.Registry.SSLPermissionsVerifier=IceTestServiceGrid/NullSSLPermissionsVerifier
IceGrid.Registry.AdminSSLPermissionsVerifier=IceTestServiceGrid/NullSSLPermissionsVerifier
#
# Dummy username and password for icegridadmin.
#
IceGridAdmin.Username=foo
IceGridAdmin.Password=bar
#set server active Connection Managerment
Ice.ACM.Server=60
#
# IceGrid node configuration.
#
IceGrid.Node.Name=node1
IceGrid.Node.Endpoints=tcp
IceGrid.Node.Data=db/node1
IceGrid.Node.CollocateRegistry=1
IceGrid.Node.Trace.Activator=1
IceGrid.Node.Trace.Adapter=2
IceGrid.Node.Trace.Server=3
根据需要在当前目录下创建db/node1,db/rescenter_registry文件夹
创建application.xml文件
<icegrid>
<application name="icetest">
<server-template id="icetest-server-template">
<parameter name="index" />
<server id="rescenter_${index}" exe="C:\Program Files\Java\jdk1.6.0_10\bin\java" activation="on-demand">
<!---server -Xms128m -Xmx256m -d64 -XX:PermSize=128m-->
<option>-classpath</option>
<option>E:\workspace\ICEServer\bin</option>
<option>-Djava.ext.dirs=E:\workspace\ICEServer\lib</option>
<option>-server</option>
<option>com.alan.ice.IceService</option>
<adapter name="testAdapter" endpoints="tcp" replica-group="ReplicatedTestAdapter" />
<property name="Ice.ThreadPool.Server.SizeMax" value="3000" />
</server>
</server-template>
<replica-group id="ReplicatedTestAdapter">
<load-balancing type="adaptive" load-sample="1" n-replicas="1" />
<object identity="messageService" type="::com::alan::ice::MessageServiceIceImpl" />
<object identity="calcService" type="::com::alan::ice::CalcServiceIceImpl" />
</replica-group>
<node name="node1">
<server-instance template="icetest-server-template" index="1" />
</node>
</application>
</icegrid>
创建start_server.bat
path=%path%;E:\Ice-3.3.0\bin
icegridnode --Ice.Config=config-ice.grid --deploy application.xml
pause
创建完成后就可以双击start_server.bat来启动服务了
6,创建客户端调用项目ICEClient,导入ice.jar以及前面生产的icetest.jar,在项目下创建IceClient .java
public class IceClient {
public static void main(String[] args){
int status = 0;
Communicator ic = null;
try{
String str = String.format("%s:%s -h %s -p %s", "IceTestServiceGrid/Locator","tcp" ,"localhost", "10000");
InitializationData localInitializationData = new InitializationData();
localInitializationData.properties = Util.createProperties();
localInitializationData.properties.setProperty("Ice.Default.Locator", str);
ic = Util.initialize(localInitializationData);
MessageServiceIcePrx messageclient = MessageServiceIcePrxHelper.checkedCast(ic.stringToProxy("messageService"));
CalcServiceIcePrx calcclient = CalcServiceIcePrxHelper.checkedCast(ic.stringToProxy("calcService"));
if (messageclient == null || calcclient == null )
throw new Error("Invalid proxy");
Map<String ,String > map = new HashMap<String, String>();
Message msg = new Message(MessageType.INFO, ActionType.Add,new int[]{1},map);
System.out.println(messageclient.sendMessage(msg));//调用接口完成消息发送
System.out.println(calcclient.calc(12, 4, CalcType.Adds));//调用接口完成数学计算
} catch (Ice.LocalException e) {
e.printStackTrace();
status = 1;
} catch (Exception e) {
System.err.println(e.getMessage());
status = 1;
}
if (ic != null) {
try {
ic.destroy();
} catch (Exception e) {
System.err.println(e.getMessage());
status = 1;
}
}
System.exit(status);
}
}
7,执行IceClient ,控制台输出
INFO Add [1]
16.0
发表评论
-
js判断一个图片是否已经存在于缓存
2013-05-31 15:15 7183【解决】js判断一个图片是否已经存在于缓存(兼容IE各版本及 ... -
java 加密解密算法总结(转)
2013-03-19 11:28 802package tianya.cn.main; im ... -
深入了解Struts2返回JSON数据的原理及具体应用范例
2013-03-18 09:40 1115转载自: http://yshjava.iteye.com/ ... -
ICE:slice语言常识整理
2013-01-28 10:53 1719============================== ... -
ICE转摘学习
2013-01-25 17:44 759Ice 出自ZeroC名门之 ... -
Google 浏览器css hack 写法
2013-01-16 11:09 704针对Chrome和Safari等Webkit核心浏览器的CS ... -
图片预加载做法
2012-12-18 17:34 757/** * 图片头数据加载就 ... -
js 事件冒泡
2012-11-19 14:40 847JavaScript事件冒泡简介及应用 一、什么是事 ... -
ant 常用命令
2012-11-12 22:03 1319C:\>ant -help\-h 获取ant的帮助信息( ... -
java 访问url获取别人的接口服务
2012-08-09 21:51 0** * 程序中访问http数据接口 ... -
Java IO系统之IO系统类层次关系
2012-08-08 09:13 0流是字节序列的抽象概念。 文件是数据的静态存储形式,而流 ... -
java缓存
2012-08-06 12:47 0JAVA缓存技术 JavaJNICacheL ... -
图片滚动带滚动条
2012-07-25 00:08 764<!DOCTYPE html PUBLIC " ... -
Web.xml文件配置
2012-06-12 23:56 727一个简单的web文件配置参考 <?xml versio ... -
java getResource()和getResourceAsStream以及路径问题(转)
2012-06-12 23:54 822用JAVA获取文件,听似简单,但对于很多像我这样的新人来说,还 ... -
MYSQL常用命令
2012-05-27 18:10 704MYSQL常用命令 1.导出整个数据库 mysqldump ... -
hibernate 使用二级缓存 配置
2012-05-26 23:57 973配置二级缓存主要有两个步骤。 选择需要使用第三方二级缓存 ... -
spring新的jar包名称,搭建框架列表
2012-04-28 13:12 869For a typical web application y ... -
图片垂直对齐的方法
2012-04-28 11:39 766<!DOCTYPE html PUBLIC " ... -
浅谈Java中的几种随机数
2012-04-20 23:51 504众所周知,随机数是任何一种编程语言最基本的特征之一。而生成随机 ...
相关推荐
包含ICE的应用实例,编译测试通过,内含C++,C#2个版本,供大家参考
使用java实现的一个ice demo,请求参数是Request对象,返回参数是Response对象
ICE的代码例子 ICE的代码例子 ICE 代码实例 VC6
Ice完整实例,详细介绍了一个完整的简单的Ice应用开发过程
ice实例,搭建过程
很不错的Ice框架学习资料,Ice综述,核心,高级,服务及实例
linux下c++实现ice amd ami模式的服务端同客户端,实现双向通信,客户端同时也是ice服务
Ice 是一种针对客户端和服务器进行通信的面向对象的中间件平台。Ice 为构建面向对象的客户-服务器应用提供了工具、API 和库支持。...客户和服务器可以分别部署,可以运行在...本代码为ice同步调用和异步调用实例代码。
delphi 操作 ofice 实例,可以运行delphi 操作 ofice 实例,可以运行delphi 操作 ofice 实例,可以运行delphi 操作 ofice 实例,可以运行
vs2005 ice3.3.1 简单客户端 服务端例子。
C#通讯编程实例基于ICE 非常适合C#初学者编程
// Communicator实例,是ice run time的主句柄 Ice.Communicator ic = null; try { // 调用Ice.Util.Initialize()初始化Ice run time System.out.println("初始化ice run time..."); ic = Ice.Util.initialize(args)...
本例为ice入门例子,综合了网络上流传的Printer的例子,里面含有详细的说明,希望能对刚入手ice的同学有所帮助
通过ICE接口调用mysql数据库实例,ICE入门最佳
ICE网络编程 有实例 希望对方大家有用
某个对象同时有多个实例,它仍是一个Ice 对象。 . 每个Ice对象都有一个或多个接口。一个接口是一个对象所支持的一系列 有名称的操作。客户通过调用操作来发出请求。 . 一个操作有零个或更多参数,以及一个返回值。...
Molaletsa Namoshe等人发表的在机器人中的开放中间件的应用。文中介绍如何打开中间件,其工作原理等,是ICE的一个极佳实例。
ANSYS_Workbench_12_基础教程与实例详解
JAVA版的iec61850实例,包括客户端和服务端,完成了对MMS的映射。