一、环境准备
1、安装VS2010
2、安装ZeroC(ICE),这里以ZeroC3.4.2版本为为例,需要设置环境变量
设置环境变量:ICE_HOME: C:\Program Files (x86)\ZeroC\Ice-3.4.2
Path变量追加:;%ICE_HOME%\bin;
注意:如果是64位的系统将安装目录下的bin\x64\下的所有文件拷贝到bin\
目录下。
二、建立项目
1、打开VS新建一个接口类库项目,名称为: ICEInterface。注意:新建项目的时候项目 路径不能有中文字符,否则ICE编译会失败,如图所示:
2、新建完成之后,然后右键项目属性,选择Ice Configuration,如图所示:
3、然后勾选Enable IceBuilder和Ice,如图所示:
4、然后我们在改项目中新建一个文件夹:SliceDefine,并且在该文件夹下面新建一个文件,名为:ICETest.ice,然后保存会发现会在该目录自动生成
一个类:ICETest.cs。ICETest.ice文件的内容为:
#ifndef _ICETEST_
#define _ICETEST_
module Lengyue{
moduleTest{
interface TestService{
//从服务器返回一串字符串
string GetServerName();
};
};
};
#endif
如图所示:
05、然后新建一个服务端类库项目,项目名称为:ICEServer,如图所示:
06、然后引用ICEInterface项目,然后右键项目选择Ice Configuration,选择Enable Ice Builder、Glacier2、IceBox、IceGrid,如图所示:
07、然后在服务端新建一个类:ICETestServiceImpl,实现接口项目Ice自动生成0的抽象类服务,代码如下:
namespace ICEServer
{
publicclassICETestServiceImpl : TestServiceDisp_
{
public override string GetServerName(Ice.Current current__)
{
return"Hello World";
}
}
}
namespace ICEServer
{
publicclassICETestServiceImpl : TestServiceDisp_
{
public override string GetServerName(Ice.Current current__)
{
return"Hello World";
}
}
}
如图所示:
08、实现接口之后,我们在新建一个类ServiceInit,这个类用于初始化接口服务,这个类需要实现IceBox.Service类,代码如下:
namespace ICEServer
{
public class ServiceInit : IceBox.Service
{
public ServiceInit()
{
}
privateObjectAdapter adapter = null;
//参数name代表部署文件中service的name属性
publicvoid start(string name, Ice.Communicator communicator, string[] args)
{
try
{
string adapterName = "IceTestAdapter-" + name;//适配器名称
adapter = communicator.createObjectAdapter(adapterName);
ICETestServiceImpl service = newICETestServiceImpl();
Identity serviceId = communicator.stringToIdentity("IceTest");
adapter.add(service, serviceId);
adapter.activate();
}
catch (System.Exception ex)
{
Console.WriteLine(ex.Message);
}
#if DEBUG
Console.WriteLine("服务已启动");
#endif
}
public void stop()
{
adapter.destroy();
}
}
}
privateObjectAdapter adapter = null;
//参数name代表部署文件中service的name属性
publicvoid start(string name, Ice.Communicator communicator, string[] args)
{
try
{
string adapterName = "IceTestAdapter-" + name;//适配器名称
adapter = communicator.createObjectAdapter(adapterName);
ICETestServiceImpl service = newICETestServiceImpl();
Identity serviceId = communicator.stringToIdentity("IceTest");
adapter.add(service, serviceId);
adapter.activate();
}
catch (System.Exception ex)
{
Console.WriteLine(ex.Message);
}
#if DEBUG
Console.WriteLine("服务已启动");
#endif
}
public void stop()
{
adapter.destroy();
}
}
}
如图所示:
09、这时服务端的代码就写完了,然后我们打开ZeroC的安装目录,找到C#的Demo项目,我的路径为: D:\Users\lengyue\Documents\ZeroC\Ice-3.4.2-demos\democs\IceBox,
然后打开项目文件夹,找到:config.icebox、config.service两个文件,将两个配置文件拷贝到服务端项目路径下面,这两个文件是用于配置IceBox调试的,如图所示:
config.icebox文件的内容为:
IceBox.Service.1=ICEServer.dll:ICEServer.ServiceInit --Ice.Config='config.service'
说明如图所示:
config.service文件的内容为:
IceTestAdapter-1.Endpoints=default -h 127.0.0.1 -p 10003
Config.RootPath=D:\zeroc\bin\AppServer\ConfigurationManage\Config
Ice.MessageSizeMax=102400
Ice.ThreadPool.Client.Size=2
Ice.ThreadPool.Client.SizeMax=10
Ice.ThreadPool.Server.Size=2
Ice.ThreadPool.Server.SizeMax=10
说明如图所示:
10、然后配置项目调试 右键config.icebox->属性,将复制到输出目录:始终复制,右键config.service->属性,将复制到输出目录:始终复制,如图所示:
右键服务端项目->属性->调试,如图所示:
11、此时服务端项目就配置开发完成,然后右键服务端项目->调试,出现如图表示服务端启动成功:
12、创建客户端项目,项目名称为:ICEClient,控制台项目,如图所示:
13、右键客户端项目->Ice Configuration,如图所示:
14、然后引用ICEInterface接口项目,在Main方法中添加如下代码:
Ice.Communicator ic = null;
try
{
ic = Ice.Util.initialize();
//IceTest这个字符串为服务的唯一标识,communicator.stringToIdentity("IceTest");
Ice.ObjectPrx objPrx = ic.stringToProxy("IceTest:default -h 127.0.0.1 -p 10003");
TestServicePrx testService = TestServicePrxHelper.checkedCast(objPrx);
if (testService == null)
{
Console.WriteLine("无效的代理");
return;
}
Console.WriteLine(testService.GetServerName());
ic.destroy();
Console.ReadKey();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
Ice.Communicator ic = null;
try
{
ic = Ice.Util.initialize();
//IceTest这个字符串为服务的唯一标识,communicator.stringToIdentity("IceTest");
Ice.ObjectPrx objPrx = ic.stringToProxy("IceTest:default -h 127.0.0.1 -p 10003");
TestServicePrx testService = TestServicePrxHelper.checkedCast(objPrx);
if (testService == null)
{
Console.WriteLine("无效的代理");
return;
}
Console.WriteLine(testService.GetServerName());
ic.destroy();
Console.ReadKey();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
如图所示:
代码说明如图:
15、此时客户端项目就开发完成,我们来调试一下,首先启动服务端程序,如图所示:
然后启动客户端程序,如下图表示成功访问服务端
收到服务端发送过来的hello world。
错误解决:
1、如果在启动服务的时候遇到如下错误,如图所示:
该错误为ice加载服务的时候去反射服务类的时候出错,由于项目是.net4.0的程序集,需要在启动icebox的时候指定运行时版本。方法如下:
(1)、在ICE安装目录下的bin\目录下找到iceboxnet.exe.config文件,没有则新建一个,然后文件里 面添加如下内容:
<?xmlversion="1.0"?>
<configuration>
<startup>
<supportedRuntime version="v4.0"sku=".NETFramework,Version=v4.0"/>
</startup>
</configuration>
对应的资源下载地址:点击下载,原创资源转载请注明原创地址,资源中包含源代码以及视频教程,下一章讲解如何部署将该项目部署到icegrid中。
欢迎大家交流,Q~Q~:670865621