`
Breese
  • 浏览: 62918 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ICE实例

 
阅读更多

本文将结合实际项目,做一个基于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

分享到:
评论

相关推荐

    Ice 经典入门和实例

    总的来说,"Ice经典入门和实例"是一套完整的学习资料,涵盖了Ice的基本概念、核心功能、高级特性和实战应用,对于想要掌握这个分布式对象中间件的开发者来说,是非常宝贵的资源。通过深入学习和实践,你将能熟练地...

    icedemo实现对象的传输与返回(java)

    在客户端,我们需要创建一个ICE的`Communicator`实例,然后通过它获取服务端的代理,调用`serve`方法,并处理返回的Response对象: ```java public class Client { public static void main(String[] args) { Ice...

    Ice入门完整实例

    【Ice入门完整实例】是一个针对初学者的教程,旨在引导用户了解并掌握Ice中间件的基本用法和开发流程。在本实例中,我们将深入探讨Ice,一个强大的分布式对象框架,它提供了一种高效的、跨平台的方式来构建分布式...

    ICE  代码实例 VC6

    在“ICE 代码实例 VC6”中,我们可以期待学习到以下关键知识点: 1. ICE框架基础:理解ICE的核心概念,如代理(Proxies)、适配器(Adapters)、对象(Objects)和接口(Interfaces)。这些是构建ICE应用的基本元素...

    ICE编程实例ICE编程实例

    总结来说,"ICE编程实例"提供了关于如何使用ICE进行分布式系统开发的实例,涵盖C++和C#两个版本。这些实例有助于开发者深入理解ICE的用法,如何在实际项目中应用ICE进行跨平台通信,以及如何解决分布式环境中的常见...

    ice搭建示例

    ice实例,搭建过程

    ice异步模式源码实例

    标题"ice异步模式源码实例"指的是通过C++在Linux环境下使用ICE框架实现AMD和AMI模式的服务端和客户端,以便进行双向通信。这种通信方式允许服务端和客户端同时处理多个请求,提高系统的响应速度和效率。 描述中的...

    ICE 简单客户端和服务端实例

    在给定的 "ICE 简单客户端和服务端实例" 中,我们有两个关键组件:consoleClient 和 consoleServer,它们是 ICE 框架下的基础应用示例,用于演示客户端和服务端如何交互。** **VS2005 (Visual Studio 2005) 是 ...

    ice同步调用和异步调用实例代码

    Ice 是一种针对客户端和服务器进行通信的面向对象的中间件平台。Ice 为构建面向对象的客户-服务器应用提供了工具、API 和库支持。...客户和服务器可以分别部署,可以运行在...本代码为ice同步调用和异步调用实例代码。

    Ice-3.3.1 ICE

    总的来说,《Distributed Programming with Ice》是一本深入浅出的书籍,不仅详细介绍了Ice框架的内部工作原理,而且还提供了丰富的实例和最佳实践,是学习和掌握Ice的理想资源。对于那些希望在分布式计算领域有所...

    ice入门例子

    - **负载均衡和容错**: 可以通过配置多个服务器实例实现负载均衡,增强系统的健壮性。 7. **扩展与高级特性** - **多线程**: 支持多线程处理请求,提高服务器性能。 - **异步调用**: 提供非阻塞的异步调用模式,...

    ICE框架 C++示例程序

    5. **透明的负载均衡和故障恢复**:ICE内置了负载均衡和故障恢复机制,可以动态调整服务实例,确保系统的高可用性。 6. **安全性**:ICE支持SSL加密,确保通信过程的安全。 7. **异步调用**:ICE允许异步调用,...

    ice安装包 for windows.zip

    `icegridadmin`则是用于管理和监控ICE网格服务的工具,可以帮助开发者管理分布式系统的实例和负载均衡。 除了上述核心组件,安装包可能还包含文档、示例代码和其他资源,帮助开发者快速理解和使用ICE。文档通常会...

    ICE客户端与服务端通信Demo

    平台编译环境:VS2017 ICE版本:3.7.7 ICEbuilder:5.0.9 源码中有两套程序: Server:启动服务器,等待连接 。连接后可双方通信 Client:连接服务器,与服务器通讯。 Slice: 手写几个接口即可。

    Ice-3.4.2安装包

    - 对于大型项目,推荐使用IceGrid进行服务管理和部署,它可以动态扩展服务实例,实现高可用性。 总的来说,Ice-3.4.2安装包提供了一个强大、灵活的框架,用于构建分布式系统。了解其特性和正确安装后,开发者可以...

    ICE客户端实现代码

    ICE客户端实现代码主要涉及到的是Tibco的ICE(Internet Communications Engine)中间件的使用,这是一种高性能、可伸缩的分布式计算框架。ICE提供了一种语言无关、平台无关的方式来构建分布式应用,支持C++、Java、...

    ICE 的聊天demo 含有ICE的配置文档

    这个聊天demo是基于ICE实现的一个实例,它包含了ICE的配置文档和使用指南,帮助开发者了解如何在Visual Studio 2013环境中集成和使用ICE。 1. **ICE中间件**:ICE是由ZeroC公司开发的跨平台通信框架,它提供了多种...

    C#通讯编程实例基于ICE

    C#通讯编程实例基于ICE 非常适合C#初学者编程

    office2.rar

    描述中的重复内容"可以运行delphi 操作 ofice 实例"表明这个压缩包可能包含了一个或多个可执行的Delphi程序,这些程序能够直接操作Office应用程序。这可能涉及到以下几个主要的知识点: 1. **VBA(Visual Basic for...

Global site tag (gtag.js) - Google Analytics