socketref,再见!高德

https://github.com/adoggie

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  246 Posts :: 4 Stories :: 312 Comments :: 0 Trackbacks

常用链接

留言簿(54)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

idl的保留关键字:'byte','bool','short','int','long','float','double','string' ,均不能用于定义module,class,interface和变量名称
定义的变量名称如果包含以下单词:'def','import','from','type','str','int','float','class' , tce生成python代码时自动给添加'_'后缀,比如: 
 struct xx{
   string name;
   string from; 
}
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)
*连接复用
  在互联网应用场景,服务器将接入大量的客户端设备,客户端是不能被寻址,所以服务器要完成推送消息给客户端,必须在客户端建立的连接上反向传输。 
  tce使这个工作变得相当简单:
    1. 客户端定义接收消息的接口 ITerminal,定义接收函数onGetServerMessage()
          class TermnialImpl(ITerminal):
               ...
     2. 创建到服务器的连接代理
          tce.RpcCommunicator.instance().init()
          prx = test.ServerProxy.create(127.0.0.1,16005)  创建但并不马上连接
     3. 添加服务类实现
          adapter = tce.RpcCommAdapter('adapter')
          impl = TerminalImpl()
          adapter.addConnection(prx.conn)
          adapter.addServant(impl)     加到通信器对象
     3.  请求一次调用
          prx.login('scott','1234')
     4.   服务器端反向调用ITerminal的onGetServerMessage()
          def login(self,user,passwd,ctx):
               prx = ITerminalProxy(ctx.conn)
               prx.onGetServerMessage('server message..')     完成一次对设备端的接口调用
posted on 2013-10-02 03:18 放屁阿狗 阅读(311) 评论(0)  编辑 收藏 引用 所属分类: TCE

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理