idl的保留关键字:'byte','bool','short','int','long','float','double','string' ,均不能用于定义module,class,interface和变量名称
}
xx结构的from变量名将生成from_
接口定义:
module test{
dictionary<string,string> Properties_t;
sequence<string> IpAddressList_t;
interface ITerminal{
void onGetServerMessage(string text);
}
interface Server{
IpAddressList_t getIpAddresses();
Properties_t getProperties();
void ping(string fromhost);
string login(string user,string passwd,ctx);
};
}
struct:
tce将结构struct映射为class对象 ,初始化成员变量并创建散列函数 marshall/unmarshall
sequence<T>:
tce将数组类型直接映射为[]
例如 :
dictionary<K,V>
tce将字典映射为 {}
python实现Server接口的getIpAddresses()方法:
def getIpAddresses():
return ['192.168.14.101','192.168.12.50']
定义服务器接口实现:
tce为interface生成接口基类: class Server
我们提供一个实现类 :
class ServerImpl(Server):
def __init__(self):
Server.__init__(self)
def getIpAddresses(self,ctx):
return []
在这里我们提供了ServerImpl类,然后编写实现函数getIpAddresses. 每个接口函数都携带ctx参数,ctx携带rpc请求的附属信息,比如: 外带数据(dict),底部的连接对象 等等 。
服务接口被称为一个服务类servant ,接下来演示如何将这个servant装配并提供客户。
tce.RpcCommunicator.instance().init()
ep = tce.RpcEndPoint(host='127.0.0.1',port=16005) 定义一个通信端点
adapter = tce.RpcCommunicator.instance().createAdapter('first_server',ep) 创建一个通信适配器
servant = ServerImpl() 创建服务接口对象
adapter.addServant(servant) 添加进适配器
tce.RpcCommunicator.instance().waitForShutdown() 进入通信循环
调用服务:
tce.RpcCommunicator.instance().init()
prx = test.ServerProxy.create(127.0.0.1,16005)
ips = prx.getIpAddresses()
多种呼叫模式:
tce将接口函数自动生成 normal,oneway,async三种调用接口方法 ,rpc调用出现异常,底部将抛出异常,所以用户需要异常捕获。
1.normal:
原型: fun_name(参数..,timeout=0,extra=None)
调用函数自动添加timeout,extra参数。timeout默认为0,将自动采用tce默认的30s等待调用返回时间;
extra 指此次调用携带的附属数据,extra ={'name':'scott','age':100}
extra数据在服务端接口函数的ctx中获取: ctx.msg.extra
函数调用时将阻塞客户线程,直到timeout超时或者服务器数据返回
2. oneway
fun_name_oneway(参数...,extra=None)
只有类型void的接口函数才会生成oneway调用方法.oneway调用不会阻塞用户线程,通常用于单向传输的场景,例如 Server接口的ping()函数
3. async
fun_name_async(参数,async_callback,extra=None)
异步调用模式不会阻塞客户线程,async_callback指定了rpc调用的返回接收函数
接收函数原型: void fun_name_CallBack(result,proxy)
例如:
def getIpAddressesResult(result,proxy):
print result #result - IpAddressList_t
prx.getIpAddresses_async(getIpAddressesResult)
1. 客户端定义接收消息的接口 ITerminal,定义接收函数onGetServerMessage()
...
2. 创建到服务器的连接代理
3. 添加服务类实现
3. 请求一次调用
4. 服务器端反向调用ITerminal的onGetServerMessage()