最近用到了ice,所以简单记录下。
编写ice文件
1、编写Ice 应用的第一步是要编写一个Slice 定义,其中含有应用所
用的各个接口。我的测试ice文件如下:
#include <Ice/Identity.ice>
module ServiceModule{
// 建立连接结构
class IConnectInfo {
["cpp:type:wstring"]
string ID;
};
class IReturnInfo {
bool IsSuccess; // 是否成功
["cpp:type:wstring"]
string Info; // 信息
};
/* 客户端实现 */
interface PublishClient {
// 控制
IReturnInfo Control(string type);
};
/* 服务端实现 */
interface PublishServer {
// 1.0建立连接
IReturnInfo ConnectToServer(Ice::Identity ident, IConnectInfo info);
};
};
服务端实现
1、创建一个servant 类,类名为ControlServer.cs
/// <summary>
/// 继承自叫作PublishServerDisp_ 的基类,这个基类由slice2cs编译器生成,其中含有一个ConnectToServer方法.
/// </summary>
public class ControlServer : PublishServerDisp_
{
/// <summary>
/// 建立连接
/// </summary>
public override IReturnInfo ConnectToServer(Identity ident, IConnectInfo info, Current current__)
{
Ice.ObjectPrx @base = current__.con.createProxy(ident);
PublishClientPrx client = PublishClientPrxHelper.checkedCast(@base);
if (client != null)
{
IceServerApplication.OneclientPrx = client;
}
IReturnInfo returnInfo = new IReturnInfo
{
Info = "ICE连接",
IsSuccess = true
};
return returnInfo;
}
}
}
2、创建IceServerApplication.cs,继承Ice.Application。
/// <summary>
/// 参考:http://blog.chinaunix.net/uid-126438-id-2924656.html
/// 服务器端通常只有一个通信器(Ice::Communicator),通信器包含了一系列的资源:
/// 如线程池、配置属性、对象工厂、日志记录、统计对象、路由器、定位器、插件管理器、对象适配器在通信器内
/// 包含有一个或更多的对象适配器(Ice::ObjectAdapter),对象适配器负责提供一个或多个传输端点,
/// 并且把进入的请求分 派到对应的servant中去执行。
/// 具体实现的部分称为servant,它们为客户端发来的调用提供服务。
/// servant向对象适配器注册以后,由对象适配器依据客户请求调用相应方法。
/// </summary>
public class IceServerApplication : Ice.Application
{
public static PublishClientPrx OneclientPrx = null;
ObjectAdapter adapter = null;
public override int run(string[] args)
{
ControlServer control = new ControlServer();
if (args.Length > 1)
{
System.Console.Error.WriteLine(appName() + ": too many arguments");
return 1;
}
// //创建名为Callback.Server的适配器
adapter = communicator().createObjectAdapter("Callback.Server");
//将服务单元增加到适配器中,并给服务对象指定名称为CallbackServer,该名称用于唯一确定一个服务单元
adapter.add(control, communicator().stringToIdentity("CallbackServer"));
//激活适配器,这样做的好处是可以等到所有资源就位后再触发
adapter.activate();
//让服务在退出之前,一直持续对请求的监听
communicator().waitForShutdown();
return 0;
}
public void close()
{
if (adapter != null)
{
communicator().destroy();
}
}
}
3、Program.cs
class Program
{
static IceServerApplication app = null;
static void Main(string[] args)
{
app = new IceServerApplication();
Thread t = new Thread(new ThreadStart(start));
t.Start();
Console.WriteLine("服务已开启!");
Console.ReadKey();
}
private static void start()
{
//ice配置文件
app.main(new string[] { }, "config.server");
}
}
4、config.server
5、参考
https://www.cnblogs.com/T-J-D/p/3849870.html
http://blog.chinaunix.net/uid-126438-id-2924656.html