ICE专题使用C#编写ICE分布式应用程序Word文件下载.docx
- 文档编号:20770952
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:7
- 大小:17.87KB
ICE专题使用C#编写ICE分布式应用程序Word文件下载.docx
《ICE专题使用C#编写ICE分布式应用程序Word文件下载.docx》由会员分享,可在线阅读,更多相关《ICE专题使用C#编写ICE分布式应用程序Word文件下载.docx(7页珍藏版)》请在冰豆网上搜索。
我们的Slice定义含有一个接口,叫作Printer。
目前,我们的接口非常简单,只提供了一个操作,叫作printString。
printString操作接受一个串作为它唯一的输入参数;
这个串的文本将会出现在(可能在远地的)打印机上。
2、编写用于C#的Slice定义
要创建我们的C#应用,第一步是要编译我们的Slice定义,生成C#代理和骨架。
在Windows上,你可以这样编译定义:
slice2cs.exePrinter.ice
slice2cs编译器根据这个定义生成一些.cs源文件。
我们目前无需关注这些文件的确切内容——它们包含的是编译器生成的代码,与我们在Printer.ice中定义的Printer接口相对应。
3、编写和编译服务器
要实现我们的Printer接口,我们必须创建一个servant类。
按照惯例,
servant类的名字是它们的接口的名字加上一个I后缀,所以我们的servant
类叫作PrinterI,并放在PrinterI.cs源文件中:
usingSystem;
namespaceIceTest
///&
lt;
summary&
gt;
///要实现我们的Printer接口,我们必须创建一个servant类。
///servant类的名字是它们的接口的名字加上一个I后缀,所以我们的servant
///类叫作PrinterI,PrinterI类继承自叫作_PrinterDisp的基类。
这个基类由
///slice2cs编译器生成,是一个抽象类,其中含有一个printString
///方法,其参数是打印机要打印的串,以及类型为Ice.Current的对象
///我们的printString方法的实现会简单地把它的参数写到终端。
/summary&
publicclassPrinterI:
_PrinterDisp
publicPrinterI()
//
//TODO:
在此处添加构造函数逻辑
}
publicoverridevoidprintString(strings,Ice.Current__current)
System.Console.WriteLine(s);
PrinterI类继承自叫作_PrinterDisp的基类。
这个基类由slice2cs编译器生成,是一个抽象类,其中含有一个printString方法,其参数是打印机要打印的串,以及类型为Ice.Current的对象.我们的printString方法的实现会简单地把它的参数写到终端。
服务器代码的其余部分在一个叫作Server.cs的源文件中,下面给出了其完整代码:
///Server的摘要说明。
publicclassServer
publicServer()
publicstaticvoidMain(string[]args)
intstatus=0;
Ice.Communicatoric=null;
try
//初始化Iceruntime,将args传递给这个调用,是因为服务器可能
//有runtime感兴趣的命令行参数,返回的是一个Ice.Communicator
//它是Iceruntime的主句柄
ic=Ice.Util.initialize(refargs);
//调用createObjectAdapterWithEndpoints创建一个对象适配器,传入的参数为SimplePrinter(适配器名称)
//和default-p10000或者是适配器使用缺省协议TCP/IP在端口10000侦听到来的请求
Ice.ObjectAdapteradapter=ic.createObjectAdapterWithEndpoints("
SimplePrinter"
"
default-p10000"
);
//这时,服务器端runtime已经初始化,我们实例化一个PrinterI对
//象,为我们的Printer接口创建一个servant。
Ice.Objectobj=newPrinterI();
//我们调用适配器的add,告诉它有了一个新的servant;
传给add的参
//数是我们刚才实例化的servant,再加上一个标识符。
在这里,
//"
串是servant的名字(如果我们有多个打印机,每个
//打印机都会有不同的名字,更正确的说法是,都会有不同的对象标识)。
adapter.add(
obj,Ice.Util.stringToIdentity("
));
//我们调用适配器的activate方法激活适配器(适配器一开
//始是在扣留(holding)状态创建的;
这种做法在下面这样的情况下很
//有用:
如果我们有多个servant,它们共享同一个适配器,而在所有
//servant实例化之前我们不想处理请求)。
一旦适配器被激活,服务器就
//会开始处理来自客户的请求。
adapter.activate();
//调用waitForShutdown。
这个方法挂起发出调用的线程,
//直到服务器实现终止为止——或者是通过发出一个调用关闭runtime,
//或者是对某个信号作出响应(目前,当我们不再需要服务器时,我们
//会简单地在命令行上中断它)。
ic.waitForShutdown();
catch(Exceptione)
Console.Error.WriteLine(e);
status=1;
finally
if(ic!
=null)
ic.destroy();
Environment.Exit(status);
Main的主体含有一个try块,我们把所有的服务器代码都放在其中;
然后是两个catch处理器。
第一个处理器捕捉Icerun
time可能抛出的所有异常,其意图是,如果代码在任何地方遇到意料之外的Ice
运行时异常,栈会一直退回到Main,打印出异常,然后把失败返回给操作系统。
第二个处理器捕捉串常量,其意图是,如果我们在代码某处遇到致命错误,我们
可以简单地抛出带有出错消息的串文本。
这也会使栈退回到main,打印出出错消息,然后把失败返回给操作系统。
这段代码会在退出之前销毁通信器(如果曾经成功创建过)。
要使Iceruntime
正常结束,这样做是必需的:
程序必须调用它所创建的任何通信器的destroy;
否则就会产生不确定的行为。
我们把对destroy
的调用放进finally块,这样,不管前面的try块中发生什么异常,通信器都保证会正确销毁。
4、编写和编译客户
客户代码在Client.cs中,看起来与服务器非常类似。
下面是完整
的代码:
namespaceIceClientTest
///Client的摘要说明。
publicclassClient
publicClient()
//调用Ice:
:
initialize初始化Iceruntime。
//获取远地打印机的代理。
我们调用通信器的stringToProxy
//创建一个代理,所用参数是"
SimplePrinter:
default-
//p10000"
。
注意,这个串包含的是对象标识和服务器所用的端口号
Ice.ObjectPrxobj=ic.stringToProxy(
"
//stringToProxy返回的代理的类型是Ice:
ObjectPrx,这种类型
//位于接口和类的继承树的根部。
但要实际与我们的打印机交谈,我们需
//要的是Printer接口、而不是Object接口的代理。
为此,我们需要调
//用PrinterPrxHelper.checkedCast进行向下转换。
这个方法会
//发送一条消息给服务器,实际询问“这是Printer接口的代理吗?
”如
//果是,这个调用就会返回Printer的一个代理;
如果代理代表的是其他
//类型的接口,这个调用就会返回一个空代理。
PrinterPrxprinter
=PrinterPrxHelper.checkedCast(obj);
//测试向下转换是否成功,如果不成功,就抛出出错消息,终止客户。
if(printer==null)
thrownewApplicationException("
Invalidproxy"
//我们的地址空间里有了一个活的代理,可以调用printString方法,
//把享誉已久的"
HelloWorld!
串传给它。
服务器会在它的终端上打印这个串。
printer.printString("
Reference:
Ice(InternetCommunicationsEngine)是由前CORBA专家MarcLaukien、MichiHenning及MatthewNewhook等人开发的新一代面向对象中间件,已被用作大型在线游戏Wish()的通信引擎。
关于Ice的详细介绍,可参考以下资料:
*《反叛之冰:
InternetCommunicationsEngine》-
*《ICE之父抵京讲解高性能网络计算引擎》-
*2004年第9期《程序员》杂志上的Ice专题-
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ICE 专题 使用 C# 编写 分布式 应用程序
![提示](https://static.bdocx.com/images/bang_tan.gif)