码迷,mamicode.com
首页 > 其他好文 > 详细

ICE学习第二步-----从第一个程序了解ICE(HelloWorld)

时间:2014-07-19 19:18:42      阅读:312      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   color   strong   

  ICE(Internet Communications Engine)是一种面向对象的中间件平台,主要用于网络通讯。它为面向对象的“客户端-服务器”模型的应用提供了一组很好的工具和API接口。目前在全世界被应用于很多项目之中。ICE中间件号称标准统一,开源,跨平台,跨语言,分布式,安全,服务透明,负载均衡,面向对象,性能优越,防火期穿透,通讯屏蔽。因此相比Corba,DCOM,SOAP,J2EE等的中间件技术,自然是集众多优点于一身,而却没有他们的缺点。

 

这次编写的小程序主要流程很简单,就是客户端向服务器发送一条消息,服务器将其打印出来显示在屏幕上,也可以说是一个类似小型打印机的程序。

 

Hello World 应用:

1、编写任何Ice 应用的第一步都是要编写一个Slice 定义,其中含有应用所

用的各个接口。我们为我们的小打印应用编写了这样的Slice 定义:

bubuko.com,布布扣

我们把这段文本保存在叫作Printer.ice 的文件中。

我们的Slice 定义含有一个接口,叫作Printer。目前,我们的接口非常简单,只提供了一个操作,叫作printString。printString 操作接受一个串作为它唯一的输入参数;这个串的文本将会出现在(可能在远地的)打印机上。

 

2、编写用于C# Slice 定义:

要创建我们的C# 应用,第一步是要编译我们的Slice 定义,生成C#代理和骨架。在Windows上,你可以这样编译定义:

slice2cs.exe Printer.ice

slice2cs 编译器根据这个定义生成一些.cs 源文件。我们目前无需关注这些文件的确切内容——它们包含的是编译器生成的代码,与我们在Printer.ice 中定义的Printer 接口相对应。

开始-->运行-->cmd-->slice2cs.exe Printer.ice(记得将你写的ICE文件拖入运行cmd看到的对应文件夹)-->回车

bubuko.com,布布扣

 

3、编写和编译服务器:

首先,我们要添加对ICE的引用,右键添加引用,选择ICE安装目录下的Ice.dll,例如我是(C:\Program Files\ZeroC\Ice-3.5.1\Assemblies..里面的Ice.dll)

其次,要实现我们的Printer 接口,我们必须创建一个servant 类。按照惯例,

servant 类的名字是它们的接口的名字加上一个I 后缀,所以我们的servant

类叫作PrinterI,添加在工程中:

bubuko.com,布布扣

PrinterI 类继承自叫作PrinterDisp_ 的基类。继承基类后我们可以简单地在PrinterDisp_ 上点击右键实现抽象类,将会自动出现对这个基类里面函数的重写(其实就是我们在ICE文件中定义的接口)。这个基类由slice2cs 编译器生成,是一个抽象类,其中含有一个printString方法,其参数是打印机要打印的串,以及类型为Ice.Current 的对象.我们的printString 方法的实现会简单地把它的参数写到终端。

bubuko.com,布布扣

服务器代码的其余部分在一个叫作Server.cs 的源文件中,下面给出了其完整代码:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 
 6 namespace Server
 7 {
 8     class Program
 9     {
10         static void Main(string[] args)
11         {
12             int status = 0;
13 
14             //创建通信器
15             Ice.Communicator ic = null;
16             try
17             {
18                 //初始化运行时
19                 ic = Ice.Util.initialize(ref args);
20 
21                 //创建适配器对象,参数为(适配器名称,缺省TCP/IP,端口号)
22                 Ice.ObjectAdapter adapter = ic.createObjectAdapterWithEndpoints("SimplePrinter", "default -p 10000");
23 
24                 //服务器端run time 已经初始化,再实例化PrinterI赋给接口(得到一个可以完成具体方法的对象)
25                 //PrinterI p = new PrinterI();Ice.Object o = p;
26                 Ice.Object obj = new PrinterI();
27 
28                 //在适配器中传入对象,以及适配器对象名称(接收者可能有多个)
29                 adapter.add(obj, Ice.Util.stringToIdentity("SimplePrinter"));
30 
31                 //激活适配器(适配器创建完毕之后处于holding状态)
32                 adapter.activate();
33 
34                 //挂起发出调用的线程,直到服务器实现终止
35                 ic.waitForShutdown();
36             }
37             catch (Exception e)
38             {
39                 Console.Error.WriteLine(e);
40                 status = 1;
41             }
42             finally
43             {
44                 if (ic != null)
45                 {
46                     ic.destroy();
47                 }
48             }
49 
50             //终止此进程并为基础操作系统提供指定的退出代码
51             Environment.Exit(status); 
52         }
53     }
54 }

Main 的主体含有一个try 块,我们把所有的服务器代码都放在其中;然后是两个catch 处理器。第一个处理器捕捉Ice run time 可能抛出的所有异常,其意图是,如果代码在任何地方遇到意料之外的Ice 运行时异常,栈会一直退回到Main,打印出异常,然后把失败返回给操作系统。第二个处理器捕捉串常量,其意图是,如果我们在代码某处遇到致命错误,我们可以简单地抛出带有出错消息的串文本。这也会使栈退回到main,打印出出错消息,然后把失败返回给操作系统。

这段代码会在退出之前销毁通信器(如果曾经成功创建过)。要使Ice run time 正常结束,这样做是必需的:程序必须调用它所创建的任何通信器的destroy ;否则就会产生不确定的行为。我们把对destroy 的调用放进finally 块,这样,不管前面的try 块中发生什么异常,通信器都保证会正确销毁。

 

4、编写和编译客户

客户代码在Client.cs 中,看起来与服务器非常类似。同样是要添加slice2cs.exe Printer.ice生成的类文件到项目中,添加对Ice.dll的引用。此时不用override基类中的方法,其实很简单,因为我们的目的是让客户端向服务器发送一条指令,让服务器去完成而已。下面是完整

的代码:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using Family;
 6 
 7 namespace IceClient
 8 {
 9     class Program
10     {
11         static void Main(string[] args)
12         {
13             int status = 0;
14 
15             //创建通信器
16             Ice.Communicator ic = null;
17             try
18             {
19                 //初始化运行时
20                 ic = Ice.Util.initialize(ref args);
21 
22                 //调用通信器的stringToProxy创建一个代理(这个串包含的是对象标识和服务器所用的端口号)
23                 Ice.ObjectPrx obj = ic.stringToProxy("SimplePrinter:default -p 10000");
24 
25                 //获取Printer接口的远程,并同时检测根据传入的名称获取的服务单元是否Printer的代理接口,如果不是则返回null对象
26                 PrinterPrx printer= PrinterPrxHelper.checkedCast(obj);
27                 if (printer == null)
28                 {
29                     throw new ApplicationException("Invalid proxy");
30                 }
31                 printer.printString("Hello World!"); 
32             }
33             catch (Exception e)
34             {
35                 Console.Error.WriteLine(e);
36                 status = 1;
37             }
38             finally
39             {
40                 if (ic != null)
41                 ic.destroy();
42             }
43             Environment.Exit(status);
44         }
45     }
46 }

结果就如下图所示:

bubuko.com,布布扣

ICE学习第二步-----从第一个程序了解ICE(HelloWorld),布布扣,bubuko.com

ICE学习第二步-----从第一个程序了解ICE(HelloWorld)

标签:des   style   blog   http   color   strong   

原文地址:http://www.cnblogs.com/T-J-D/p/3849870.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!