zoukankan      html  css  js  c++  java
  • 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:workspaceICEServiceslice
    
    E:Ice-3.3.0inslice2java -I. --output-dir=../src *.ice //生产代码
    
    E:Ice-3.3.0inslice2html -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 FilesJavajdk1.6.0_10injava" activation="on-demand">
    <!---server -Xms128m -Xmx256m -d64 -XX:PermSize=128m-->
    <option>-classpath</option>
    <option>E:workspaceICEServerin</option>
    <option>-Djava.ext.dirs=E:workspaceICEServerlib</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.0in
    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]


  • 相关阅读:
    题解 P2280 【[HNOI2003]激光炸弹】
    线段树求逆序对
    题解 P3378 【【模板】堆】
    动态规划-最大算式 蓝桥杯ALGO-116
    动态规划-树形动态规划-结点选择
    Trie树(字典树)-题解 P2580 【于是他错误的点名开始了】
    清北学堂-DAY2-数论专题-中国剩余定理(CRT)
    听课笔记--DP--Authentication Failed
    听课笔记--DP--最大子矩阵和
    多媒体基础
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9410101.html
Copyright © 2011-2022 走看看