1、在ICE的客户端获取代理的方式如下: A、Ice::ObjectPrx p = communicator->stirngToProxy("MyProxy:tcp -h 10.0.0.1 -p 12345");
注:MyProxy:tcp -h 10.0.0.1 -p 12345 远程服务单元名称:协议 -h 主机 -p 端口号 B、Ice::ObjectPrx p = communicator->propertyToProxy("MyProxy"); 在配置文件中配置MyProxy=MyProxy:tcp -h 10.0.0.1 -p 12345 C、Ice::ObjectPrx p = myproxy.ice_oneway(); D、MyProxyPrx p = myservant->op(); (slice: MyProxy * op())2、每个proxy对象都需要绑定一个远地的端点信息,其字符串的端点格式如下: identity -f facet -t -o -O -d -D -s @ adapter_id : endpoints 其中endpoints的语法如下: tcp -h host -p port -t timeout -z udp -v major.minor -e major.minor -h host -p port -z --ttl TTL --interface INTF ssl -h host -p port -t timeout -z opaque -t type -v value3、注意在proxy上有一些工厂方法能够clone出来一个新的proxy,但是新的proxy会根据工厂方法过滤掉一些端点信息 ice_secure 只使用ssl端点信息 ice_batchDatagram、ice_datagram 只使用udp端点信息 ice_oneway、ice_twoway、ice_batchOneway 使用tcp和ssl端点信息4、可以设置ICE的proxy的默认属性,例如:Ice.Default.Secure = 0 也可以强制ICE的proxy的属性,例如:Ice.Override.Secure = 15、proxy的消息调用过程中,除了可以传递参数外,还可以传递上下文信息,客户端代码例如: Ice::Context ctx; ctx["Property1"] = "value1"; ctx["Property2"] = "value2"; MyProxy->op(ctx); 由于上下文信息仅仅能够传递字符串信息,无强制类型限制,在请求的编码和解码上也存在一定的效率问题,因此不是 非得使用上下文,尽量不要使用 服务器端代码如下: void MyServerI::op(const Ice::Current& c) { Ice::Context::const_iterator l = c.ctx.find("Property1"); if (l != c.ctx.end() && l->second == "value1") { } l = c.ctx.find("Property2"); if (l != c.ctx.end() && l->second == "value2") { } }6、 使用communicator的隐式上下文传递,通过如下方法获取communicator上的隐式上下文: Ice::ImplicitContextPtr Ice::CommunicatorI::getImplicitContext() const 然后通过隐式上下文的接口设置communicator上的隐式上下文,这样导致基于该communicator的所有代理请求都会携带设置的上下文 local interface ImplicitContext { Context getContext(); void setContext(Context newContext); string get(string key); string put(string key, string value); string remove(string key); bool containsKey(string key); };7、proxy上的超时设置,可以通过如下方法指定proxy上的请求超时时间 A、Ice::ObjectPrx MyTimeOutProxy = MyProxy.ice_timeout(10000); 10秒超时 B、通过代理的端点指定:ident:tcp -h somehost -t 5000:ssl -h somehost -t 5000 C、通过配置属性设置:Ice.Override.ConnectTimeOut、Ice.Override.TimeOut