ICE学习第二步-----从第一个程序了解ICE(HelloWorld)
ICE(Internet Communications Engine)是一种面向对象的中间件平台,主要用于网络通讯。它为面向对象的“客户端-服务器”模型的应用提供了一组很好的工具和API接口。目前在全世界被应用于很多项目之中。ICE中间件号称标准统一,开源,跨平台,跨语言,分布式,安全,服务透明,负载均衡,面向对象,性能优越,防火期穿透,通讯屏蔽。因此相比Corba,DCOM,SOAP,J2EE等的中间件技术,自然是集众多优点于一身,而却没有他们的缺点。
这次编写的小程序主要流程很简单,就是客户端向服务器发送一条消息,服务器将其打印出来显示在屏幕上,也可以说是一个类似小型打印机的程序。
Hello World 应用:
1、编写任何Ice 应用的第一步都是要编写一个Slice 定义,其中含有应用所
用的各个接口。我们为我们的小打印应用编写了这样的Slice 定义:
我们把这段文本保存在叫作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看到的对应文件夹)-->回车
3、编写和编译服务器:
首先,我们要添加对ICE的引用,右键添加引用,选择ICE安装目录下的Ice.dll,例如我是(C:\Program Files\ZeroC\Ice-3.5.1\Assemblies..里面的Ice.dll)
其次,要实现我们的Printer 接口,我们必须创建一个servant 类。按照惯例,
servant 类的名字是它们的接口的名字加上一个I 后缀,所以我们的servant
类叫作PrinterI,添加在工程中:
PrinterI 类继承自叫作PrinterDisp_ 的基类。继承基类后我们可以简单地在PrinterDisp_ 上点击右键实现抽象类,将会自动出现对这个基类里面函数的重写(其实就是我们在ICE文件中定义的接口)。这个基类由slice2cs 编译器生成,是一个抽象类,其中含有一个printString方法,其参数是打印机要打印的串,以及类型为Ice.Current 的对象.我们的printString 方法的实现会简单地把它的参数写到终端。
服务器代码的其余部分在一个叫作Server.cs 的源文件中,下面给出了其完整代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace Server
{
class Program
{
static void Main(string[] args)
{
int status = ; //创建通信器
Ice.Communicator ic = null;
try
{
//初始化运行时
ic = Ice.Util.initialize(ref args); //创建适配器对象,参数为(适配器名称,缺省TCP/IP,端口号)
Ice.ObjectAdapter adapter = ic.createObjectAdapterWithEndpoints("SimplePrinter", "default -p 10000"); //服务器端run time 已经初始化,再实例化PrinterI赋给接口(得到一个可以完成具体方法的对象)
//PrinterI p = new PrinterI();Ice.Object o = p;
Ice.Object obj = new PrinterI(); //在适配器中传入对象,以及适配器对象名称(接收者可能有多个)
adapter.add(obj, Ice.Util.stringToIdentity("SimplePrinter")); //激活适配器(适配器创建完毕之后处于holding状态)
adapter.activate(); //挂起发出调用的线程,直到服务器实现终止
ic.waitForShutdown();
}
catch (Exception e)
{
Console.Error.WriteLine(e);
status = ;
}
finally
{
if (ic != null)
{
ic.destroy();
}
} //终止此进程并为基础操作系统提供指定的退出代码
Environment.Exit(status);
}
}
}
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基类中的方法,其实很简单,因为我们的目的是让客户端向服务器发送一条指令,让服务器去完成而已。下面是完整
的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Family; namespace IceClient
{
class Program
{
static void Main(string[] args)
{
int status = ; //创建通信器
Ice.Communicator ic = null;
try
{
//初始化运行时
ic = Ice.Util.initialize(ref args); //调用通信器的stringToProxy创建一个代理(这个串包含的是对象标识和服务器所用的端口号)
Ice.ObjectPrx obj = ic.stringToProxy("SimplePrinter:default -p 10000"); //获取Printer接口的远程,并同时检测根据传入的名称获取的服务单元是否Printer的代理接口,如果不是则返回null对象
PrinterPrx printer= PrinterPrxHelper.checkedCast(obj);
if (printer == null)
{
throw new ApplicationException("Invalid proxy");
}
printer.printString("Hello World!");
}
catch (Exception e)
{
Console.Error.WriteLine(e);
status = ;
}
finally
{
if (ic != null)
ic.destroy();
}
Environment.Exit(status);
}
}
}
结果就如下图所示:
ICE学习第二步-----从第一个程序了解ICE(HelloWorld)的更多相关文章
- OpenGL学习笔记1——第一个程序
学习的参考书基本是按照GL编程指南,如果有消息机制概念,对于GLUT的理解是很自然的.下面就按照自己写的第一个程序详细解释一下GL,还是比较容易上手的. 程序实现的功能是,根据当前随即种子摇出来的结果 ...
- DirectX11 学习笔记1 - 第一个程序
为了加快学习速度,和使程序更加easy理解. 我把sampler tutorial里面的一个样例 的固定代码和常常修改的代码经过简单的类的封装了一下. 以后学习的时候就能够仅仅在还有一个文件写ren ...
- (转载)OC学习篇之---第一个程序HelloWorld
之前的一片文章简单的介绍了OC的相关概述,从这篇开始我们就开始学习OC的相关知识了,在学习之前,个人感觉需要了解的其他的两门语言:一个是C/C++,一个是面向对象的语言(当然C++就是面向对象,不过这 ...
- 重新学习之spring第一个程序,配置IOC容器
第一步:导入相关jar包(此范例导入的是spring3.2.4版本,spring2.5版本只需要导入spring核心包即可) 第二步:在项目的src下配置applicationContext.xml的 ...
- OC学习篇之---第一个程序HelloWorld
从这篇开始我们就开始学习OC的相关知识了,在学习之前,个人感觉需要了解的其他的两门语言:一个是C/C++,一个是面向对象的语言(当然C++就是面向对象,不过这里最好还是Java).在干活之前,得先找到 ...
- android学习三---创建第一个程序
1.创建一个Helloworld程序 1.1 new-android application 点击file-new-android application出现如下界面 填上应用名,项目名,包名,选择所 ...
- echarts+thinkphp 学习写的第一个程序
一.前台 建个名为map.html,代码如下. <!doctype html><html lang="en"><head> <meta c ...
- OGRE 1.9 的第一个程序(OGRE HelloWorld程序)
平台:win7, VS2010 先看运行结果吧: 1. 安装OGRE 下载OGRE SDK 1.9,解压,放在你喜欢的地方,在OGRE SDK文件加下创建“OGRE_HOME.bat.bat”文本文件 ...
- java学习 之 第一个程序及认识
以前也看过一系列的java方面的程序,但是还没有正式敲过,今天正式学习并且正式敲出代码.在这里记录下来今日所得 写作工具:Notepad++ 在写作工具方面好多人建议用 记事本,但是我还是认为用 No ...
随机推荐
- POJ 1159 Palindrome 最长公共子序列的问题
Description A palindrome is a symmetrical string, that is, a string read identically from left to ri ...
- MVC 5 App 通过 Facebook OAuth2 登陆(Sign-on)的问题
今天做了下MVC 5 App通过Google, Twitter, Linkedin 和 Facebook进行登录的例子, 算是对Asp.net Identity的一个入门,做的过程中发现了如下的问题, ...
- 更改mysql数据库latin1_swedish_ci为utf8
原文在http://bingu.net/472/latin1_swedish_ci-to-utf8_general_ci/把下列文件保存为一个.php文件,然后运行 <?phpdefine('D ...
- kafka consumer频繁reblance
转载请注明地址http://www.cnblogs.com/dongxiao-yang/p/5417956.html 结论与下文相同,kafka不同topic的consumer如果用的groupid名 ...
- web项目学习之sitemesh
sitemesh主要有三个主要文件:sitemesh.xml,decorators.xml和做布局用的jsp页面. 一.sitemesh.xml 对于sitemesh.xml这个文件,官方文档上说它不 ...
- Eclipse如何生成带有自定tag的Java Doc
1. 选择要生成Java Doc的工程,单击鼠标右键,在弹出菜单中选择[Export],会弹出以下对话框: 2. 选择[Java]--->[Javadoc],点击[Next]按钮,弹出以下对话框 ...
- 常用的js效验
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- HDU ACM 1025 Constructing Roads In JGShining's Kingdom->二分求解LIS+O(NlogN)
#include<iostream> using namespace std; //BFS+优先队列(打印路径) #define N 500005 int c[N]; int dp[N]; ...
- Java_Activiti5_菜鸟也来学Activiti5工作流_之初识常用服务类和数据表(二)
/** * 代码清单中使用 ProcessEngines类加载默认的流程配置文件(activiti.cfg.xml),再获取各个服务组件的实例. * RepositoryService主要用于管理流程 ...
- css-3列布局
三列布局的步骤是,先定义左右两侧,然后定义中间,并设置'中间'部分的'margin'属性.并且'中间'部分不用设置'width'.例如: <!DOCTYPE html PUBLIC " ...