只贴出一些自己懂的。 以后懂多少贴多少
通信器的接口是用Slice 定义的。下面是其部分接口:
1 module Ice {
2 local interface Communicator {
3 string proxyToString(Object* obj);
4 Object* stringToProxy(string str);
5 ObjectAdapter createObjectAdapter(string name);
6 ObjectAdapter createObjectAdapterWithEndpoints(string name,string endpoints);
7 void shutdown();
8 void waitForShutdown();
9 void destroy();
10
11 };
12 //
13 };
通信器提供了一些操作:
• proxyToString
• stringToProxy
这两个操作允许你把代理转换成串化表示,或进行反向转换。
• createObjectAdapter
• createObjectAdapterWithEndpoints
这两个操作创建新的对象适配器。每个对象适配器都与一个或更多
传输端点关联在一起。一个对象适配器通常拥有一个传输端点。但是,
一个对象适配器也可以提供多个传输端点。如果是这样,这些端点可以
通往同一组对象,但代表访问这些对象的不同手段。这很有用,例如,
服务器在防火墙后面,但必须让内部和外部的客户都能访问它;把适配
器同时绑定到内部和外部接口,就可以其中任何一个接口访问在服务器
中实现的对象了。
createObjectAdapter 根据配置信息(参见第20 章)来确定把自己
绑定到哪个端点,而createObjectAdapterWithEndpoints 允许你为新
适配器指定传输端点。你通常会优先于createObjectAdapterWithEndpoints
使用createObjectAdapter。这样,就能把与传输机制相关的信
息(比如主机名和端口号)放在 源码外面,通过改变属性,你可以对
应用进行重配置(于是,在传输端点需要改变时,不用重新进行编
译)。
• shutdown
这个操作关闭服务器端的Ice run time:
• 在shutdown 被调用时,仍处在执行过程中的操作调用可以正常完成。
shutdown 不会等待这些操作完成;在shutdown 返回时,你所知道的
是:不会再有新的请求被分派,但在你调用shutdown 时已经在执行
之中的操作可能仍在运行。你可以调用waitForShutdown,等待仍在
执行的操作完成。
• 在服务器调用shutdown 之后到达的操作调用或者会失败(抛出
ConnectFailedException),或者会被透明地重定向到服务器的某个
新实例(参见第20 章)。
• waitForShutdown
这个操作挂起发出调用的线程,直到通信器关闭为止(也就是说,
直到在服务器中不再有操作在执行为止)。这样,你可以在销毁通信器
之前,等待服务器空闲下来。
• destroy
这个操作销毁通信器及其相关资源,比如线程、通信端点,以及内
存资源。一旦你销毁了通信器(因此也就销毁了该通信器的run
time),你不能再调用其他任何Ice 操作(除了创建另外的通信器)。
在离开程序的main 函数之前要调用destroy,这是强制性的。不这
样做会导致不确定的行为。
在离开main 之前调用destroy 是必需的,因为destroy 会在返回
之前等待所有运行中的线程终止。如果你没有调用destroy 就离开
main,你就会留下许多仍在运行的线程;许多线程包不允许你这样做,
你最终会使程序崩溃。
如果你没有调用shutdown 就调用destroy,在这个调用返回之前,它会
等待所有执行中的操作调用完成(也就是说, destroy 的实现隐含地调用
shutdown,然后调用waitForShutdown)。shutdown (因此,也包括
destroy)会解除与通信器相关联的所有对象适配器的激活。
在客户端,如果你在操作执行过程中调用shutdown,这些操作会终止,
抛出CommunicatorDestroyedException。