IMC-SDK
Instant Message Communication 开发工具包
作为即时通信软件的底层通信功能被独立分隔出来,同样也可以以用于其他的通信需求.
IMC从ACE和ICE吸收优秀的概念和技术,通信处理不免都是C/S的模式,一头请求,另外一头接收处理并返回处理结果. 同Ice一样,所有操作都
被视为远程调用RPC。
不同的应用需求,在设计开发时,我们将定义无数的数据类型影射到应用模型对象,并被序列化传输到远端,这些编码工作无疑是容易出错的,并且是令人沮丧的。既然是RPC的一种实现,IDL是好的中间语言,所有的应用模型都可以定义在IDL,通过slice工具将其翻译到不同的实现语言,slice将处理好数据对象的Marshalling&UnMarshalling等工作。
IMC与ICE的相同:
采用一致的数据类型(int,byte,short,long,float,double,string)
一致的通信协议定义,参考ice1.3文档
支持同步和异步调用;支持oneway调用
支持参数的out
IMC与ICE不同之处:
IMC 不支持class;接口不能被当作参数传递;
支持Tcp和UDT通信方式,tcp和udt的连接(connection)上进行双向的Rpc调用(Ice一般在一个连接上是单向的)。
调用的返回:
1.
同步调用:
1.1. 接收到返回结果
1.2. 超时(timeout调用时)
1.3. 连接(connection)断开
1.4. 系统结束处于终止清理阶段(将删除所有的connection)
2.
异步调用:
即可返回
函数序列化(operator):
参数支持IN,OUT类型,但不支持 INOUT类型,且OUT类型必须在IN之后被定义(同ice)。每个函数(operator)都将有一个仅对于interface内的索引编号(integer),参数将被置于参数栈(ParameterStack).
字节流到函数参数时,先从包内找出此次调用接口的类型,根据函数编号找到解析此参数栈的函数,并将剩余的字节流传递到以上函数去解析
Struct OperatorMap{
Int
index;
String
name;
Void
decode(ByteArray& bytes);
};
Class Security{
Virtual string close(int reason);
Friend __security_decode_close;
}
Static __security_decode_close(ByteArray&
bytes, void* obj);
OperatorMap __omap_security={0,”close”,__security_decode_close};
//解码字节到函数参数,并最终调用Rpc函数
//以下代码自动生成
ParameterStack __security_decode_close(ByteArray&
bytes, void* obj){
Security
* sec = (Security*)obj;
Parameter
p;
ParameterStack
pstack;
P = unMarshallingParameter(bytes,”int”);
Int reason = p;
P
= Sec->close(reason);
Pstack.push(p);
Return
pstack;
}