ICE实现服务器客户端

- 日理万妓 2022-09-19 10:41 304阅读 0赞

本文将结合实际项目,做一个基于ice的实际项目实例应用,该实例完成客户端调用服务端接口完成消息发送,计算的功能。

1,创建java项目ICEServer,导入ice.jar.

2,在项目下创建slice文件夹,编写model.ice,service.ice,service2.ice文件,其内容如下

  1. model.ice
  2. #ifndef _MODEL
  3. #define _MODEL
  4. module com
  5. {
  6. module alan
  7. {
  8. module generated
  9. {
  10. module model
  11. {
  12. /**定义整型数组**/
  13. sequence<int> IntegerArray;
  14. /**自定义Map类型**/
  15. dictionary<string, string> CustomMap;
  16. /**消息类型**/
  17. enum MessageType {ERROR,INFO,WARNING};
  18. /**计算操作类型**/
  19. enum CalcType {Adds,Subtract,Multiply,Divide};
  20. /**消息的操作类型**/
  21. enum ActionType {Add,Remove,Stop,Start,Pause};
  22. /** 消息结构 **/
  23. ["java:getset"]
  24. struct Message {
  25. /**消息类型**/
  26. MessageType type;
  27. /**消息类型**/
  28. ActionType action;
  29. /**相关id**/
  30. IntegerArray relatedIds;
  31. /**扩展属性**/
  32. CustomMap extention;
  33. };
  34. };
  35. };
  36. };
  37. };
  38. #endif
  39. service.ice
  40. #ifndef _GENERATED
  41. #define _GENERATED
  42. #include <model.ice>
  43. module com
  44. {
  45. module alan
  46. {
  47. module generated
  48. {
  49. interface MessageServiceIce
  50. {
  51. /**
  52. * 向ice服务发送信息
  53. * @param message 消息内容
  54. * @return true 成功 false 失败
  55. */
  56. string sendMessage(model::Message msg);
  57. };
  58. };
  59. };
  60. };
  61. #endif
  62. service2.ice
  63. #ifndef _GENERATED
  64. #define _GENERATED
  65. #include <model.ice>
  66. module com
  67. {
  68. module alan
  69. {
  70. module generated
  71. {
  72. interface CalcServiceIce
  73. {
  74. /**
  75. * 服务端计算方法
  76. * @param d1 计算数1
  77. * @param d2 计算数2
  78. * @param type 计算方式
  79. * @return true 成功 false 失败
  80. */
  81. double calc(double d1, double d2, model::CalcType cal);
  82. };
  83. };
  84. };
  85. };
  86. #endif
  87. 3.dos环境下执行
  88. cd E:\workspace\ICEService\slice
  89. E:\Ice-3.3.0\bin\slice2java -I. --output-dir=../src *.ice //生产代码
  90. 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实现数学计算:

  1. public class CalcServiceIceImpl extends _CalcServiceIceDisp {
  2. public double calc(double num1, double num2, CalcType type,
  3. Current arg3) {
  4. double re = 0.0d;
  5. switch (type) {
  6. case Adds:
  7. re = num1 + num2;
  8. break;
  9. case Subtract:
  10. re = num1 - num2;
  11. break;
  12. case Multiply:
  13. re = num1 * num2;
  14. break;
  15. case Divide:
  16. re = num1 / num2;
  17. break;
  18. default:
  19. break;
  20. }
  21. return re;
  22. }
  23. }
  24. MessageServiceIceImpl .java实现发送消息
  25. public class MessageServiceIceImpl extends _MessageServiceIceDisp {
  26. public String sendMessage(Message msg, Current __current) {
  27. String str = msg.getType() +" "+ msg.getAction()+" " + Arrays.toString(msg.getRelatedIds());
  28. return str;
  29. }
  30. }
  31. IceService .java实现服务器端接口注册:
  32. public class IceService {
  33. public static void main(String[] args){
  34. int status = 0;
  35. Communicator ic = null;
  36. try{
  37. ic = Ice.Util.initialize(args);
  38. Ice.ObjectAdapter adapter = ic.createObjectAdapterWithEndpoints("testAdapter", "default -h *");
  39. ObjectImpl object1 = new MessageServiceIceImpl();
  40. ObjectImpl object2 = new CalcServiceIceImpl();
  41. adapter.add(object1, ic.stringToIdentity("messageService"));
  42. adapter.add(object2, ic.stringToIdentity("calcService"));
  43. adapter.activate();
  44. ic.waitForShutdown();
  45. } catch (Ice.LocalException e) {
  46. e.printStackTrace();
  47. status = 1;
  48. } catch (Exception e) {
  49. System.err.println(e.getMessage());
  50. status = 1;
  51. }
  52. if (ic != null) {
  53. try {
  54. ic.destroy();
  55. } catch (Exception e) {
  56. System.err.println(e.getMessage());
  57. status = 1;
  58. }
  59. }
  60. System.exit(status);
  61. }
  62. }
  63. 5,发布接口
  64. 在项目下创建deploy文件夹,在其下创建config-ice.grid配置文件
  65. IceGrid.InstanceName=IceTestServiceGrid
  66. #
  67. # The IceGrid locator proxy.
  68. #
  69. Ice.Default.Locator=IceTestServiceGrid/Locator:tcp -p 10000
  70. #
  71. # IceGrid registry configuration.
  72. #
  73. IceGrid.Registry.Client.Endpoints=tcp -p 10000
  74. IceGrid.Registry.Server.Endpoints=tcp
  75. IceGrid.Registry.Internal.Endpoints=tcp
  76. IceGrid.Registry.Data=db/rescenter_registry
  77. IceGrid.Registry.PermissionsVerifier=IceTestServiceGrid/NullPermissionsVerifier
  78. IceGrid.Registry.AdminPermissionsVerifier=IceTestServiceGrid/NullPermissionsVerifier
  79. IceGrid.Registry.SSLPermissionsVerifier=IceTestServiceGrid/NullSSLPermissionsVerifier
  80. IceGrid.Registry.AdminSSLPermissionsVerifier=IceTestServiceGrid/NullSSLPermissionsVerifier
  81. #
  82. # Dummy username and password for icegridadmin.
  83. #
  84. IceGridAdmin.Username=foo
  85. IceGridAdmin.Password=bar
  86. #set server active Connection Managerment
  87. Ice.ACM.Server=60
  88. #
  89. # IceGrid node configuration.
  90. #
  91. IceGrid.Node.Name=node1
  92. IceGrid.Node.Endpoints=tcp
  93. IceGrid.Node.Data=db/node1
  94. IceGrid.Node.CollocateRegistry=1
  95. IceGrid.Node.Trace.Activator=1
  96. IceGrid.Node.Trace.Adapter=2
  97. IceGrid.Node.Trace.Server=3
  98. 根据需要在当前目录下创建db/node1db/rescenter_registry文件夹
  99. 创建application.xml文件
  100. <icegrid>
  101. <application name="icetest">
  102. <server-template id="icetest-server-template">
  103. <parameter name="index" />
  104. <server id="rescenter_${index}" exe="C:\Program Files\Java\jdk1.6.0_10\bin\java" activation="on-demand">
  105. <!---server -Xms128m -Xmx256m -d64 -XX:PermSize=128m-->
  106. <option>-classpath</option>
  107. <option>E:\workspace\ICEServer\bin</option>
  108. <option>-Djava.ext.dirs=E:\workspace\ICEServer\lib</option>
  109. <option>-server</option>
  110. <option>com.alan.ice.IceService</option>
  111. <adapter name="testAdapter" endpoints="tcp" replica-group="ReplicatedTestAdapter" />
  112. <property name="Ice.ThreadPool.Server.SizeMax" value="3000" />
  113. </server>
  114. </server-template>
  115. <replica-group id="ReplicatedTestAdapter">
  116. <load-balancing type="adaptive" load-sample="1" n-replicas="1" />
  117. <object identity="messageService" type="::com::alan::ice::MessageServiceIceImpl" />
  118. <object identity="calcService" type="::com::alan::ice::CalcServiceIceImpl" />
  119. </replica-group>
  120. <node name="node1">
  121. <server-instance template="icetest-server-template" index="1" />
  122. </node>
  123. </application>
  124. </icegrid>
  125. 创建start_server.bat
  126. path=%path%;E:\Ice-3.3.0\bin
  127. icegridnode --Ice.Config=config-ice.grid --deploy application.xml
  128. pause
  129. 创建完成后就可以双击start_server.bat来启动服务了
  130. 6,创建客户端调用项目ICEClient,导入ice.jar以及前面生产的icetest.jar,在项目下创建IceClient .java
  131. public class IceClient {
  132. public static void main(String[] args){
  133. int status = 0;
  134. Communicator ic = null;
  135. try{
  136. String str = String.format("%s:%s -h %s -p %s", "IceTestServiceGrid/Locator","tcp" ,"localhost", "10000");
  137. InitializationData localInitializationData = new InitializationData();
  138. localInitializationData.properties = Util.createProperties();
  139. localInitializationData.properties.setProperty("Ice.Default.Locator", str);
  140. ic = Util.initialize(localInitializationData);
  141. MessageServiceIcePrx messageclient = MessageServiceIcePrxHelper.checkedCast(ic.stringToProxy("messageService"));
  142. CalcServiceIcePrx calcclient = CalcServiceIcePrxHelper.checkedCast(ic.stringToProxy("calcService"));
  143. if (messageclient == null || calcclient == null )
  144. throw new Error("Invalid proxy");
  145. Map<String ,String > map = new HashMap<String, String>();
  146. Message msg = new Message(MessageType.INFO, ActionType.Add,new int[]{1},map);
  147. System.out.println(messageclient.sendMessage(msg));//调用接口完成消息发送
  148. System.out.println(calcclient.calc(12, 4, CalcType.Adds));//调用接口完成数学计算
  149. } catch (Ice.LocalException e) {
  150. e.printStackTrace();
  151. status = 1;
  152. } catch (Exception e) {
  153. System.err.println(e.getMessage());
  154. status = 1;
  155. }
  156. if (ic != null) {
  157. try {
  158. ic.destroy();
  159. } catch (Exception e) {
  160. System.err.println(e.getMessage());
  161. status = 1;
  162. }
  163. }
  164. System.exit(status);
  165. }
  166. }
  167. 7,执行IceClient ,控制台输出
  168. INFO Add [1]

发表评论

表情:
评论列表 (有 0 条评论,304人围观)

还没有评论,来说两句吧...

相关阅读