CS IDL IDL IDL java IDL c client

  • Slides: 54
Download presentation

开发步骤图---C/S使用不同语言 IDL编辑器 IDL文件 IDL java编译器 IDL c++编译器 client. java stubs. java types. hh java.

开发步骤图---C/S使用不同语言 IDL编辑器 IDL文件 IDL java编译器 IDL c++编译器 client. java stubs. java types. hh java. ORB 运行时库 客户端程 序 IIOP stubs. cc serv. hh 服务端程 序 skels. cc server. cc C++ORB 运行时库

开发目标:填表格程序 //界面定义grid. idl interface grid{ attribute short height; attribute short width; void set (

开发目标:填表格程序 //界面定义grid. idl interface grid{ attribute short height; attribute short width; void set ( in short n, in short m, in long value); long get (in short n, in short m); }

客户端(1)接口映射-桩头文件 grid. hh: class grid: virtual public CORBA: : Object { …… static grid_ptr

客户端(1)接口映射-桩头文件 grid. hh: class grid: virtual public CORBA: : Object { …… static grid_ptr _duplicate(grid_ptr); static grid_ptr _narrow(CORBA: : Object*); virtual CORBA: : Short height(); virtual void height(CORBA: : Short n); virtual CORBA: : Short width(); virtual void width(CORBA: : Short m); virtual void set (CORBA: : Short n, CORBA: : Short m, CORBA: : Long value); virtual CORBA: : Long get (CORBA: : Short n, CORBA: : Short m); ……}

客户端(1)接口映射-桩实现 void grid: : height( CORBA: : Short _par__value ){ CORBA: : Static. Request

客户端(1)接口映射-桩实现 void grid: : height( CORBA: : Short _par__value ){ CORBA: : Static. Request __req( this, "_set_height" ); __req. add_in_arg( &_par__value ); __req. invoke(); } CORBA: : Short grid: : height(){ CORBA: : Short _res; CORBA: : Static. Request __req( this, "_get_height" ); __req. set_result( &_res ); __req. invoke(); return _res; }

客户端(4)ORB初始化 CORBA: : ORB_var orb= CORBA: : ORB_init(. . . );

客户端(4)ORB初始化 CORBA: : ORB_var orb= CORBA: : ORB_init(. . . );

客户端(5)字符串与引用 (1)引用转换成字符串 char *refstr; grid_var gv=. . . ; refstr=orb->object_to_string(gv); (2)字符串转换成引用 CORBA: : Object_var

客户端(5)字符串与引用 (1)引用转换成字符串 char *refstr; grid_var gv=. . . ; refstr=orb->object_to_string(gv); (2)字符串转换成引用 CORBA: : Object_var objv= orb->string_to_object(refstr); grid_var gv=grid: : _narrow(objv);

客户端主程序 #include “grid. hh” int main(int argc, char *argv[]) { CORBA: : ORB_var orb=

客户端主程序 #include “grid. hh” int main(int argc, char *argv[]) { CORBA: : ORB_var orb= CORBA: : ORB_init(argc, argv); 去掉这段在每个客户端中几乎都不会改变的程序, CORBA: : String_var refstr; 你能看出下面的程序是做本地进程内调用、进程 cin>>refstr; CORBA: : Object_var obj=orb string_to_object(refstr); 间调用或是远程调用吗? grid_var gv=grid: : _narrow(obj); CORBA: : Short h, w; CORBA: : Long v; h=gv->height(); w=gv->width(); gv->set(2, 4, 123); v=gv->get(2, 4); }

服务器端(1)接口映射-框架头文件 Grid_skel. hh: class POA_grid: public virtual Portable. Server: : Servant. Base{ void dispatch(const

服务器端(1)接口映射-框架头文件 Grid_skel. hh: class POA_grid: public virtual Portable. Server: : Servant. Base{ void dispatch(const char* operation); grid* _this(); …… virtual CORBA: : Short height()=0; virtual void height(CORBA: : Short n)=0; virtual CORBA: : Short width()=0; virtual void width(CORBA: : Short m)=0; virtual void set (CORBA: : Short n, CORBA: : Short m, CORBA: : Long value)=0; virtual CORBA: : Long get (CORBA: : Short n, CORBA: : Short m)=0; …… }

服务器端(1)接口映射-框架实现文件 void POA_grid: : dispatch(CORBA: : Request_ptr __req) { if( strcmp( __req->op_name(), “_get_height" )

服务器端(1)接口映射-框架实现文件 void POA_grid: : dispatch(CORBA: : Request_ptr __req) { if( strcmp( __req->op_name(), “_get_height" ) == 0 ) { CORBA: : Short _res; __req->set_result( &_res ); if( !__req->read_args() ) return; _res = height(); __req->write_results(); return; } else if( strcmp( __req->op_name(), “_set_height" ) == 0){ CORBA: : Short _par__value; __req->add_in_arg( & _par__value); if( !__req->read_args() ) return; height( _par__value ); __req->write_results(); return; }

服务器端(1)接口映射-框架实现文件 else if( strcmp( __req->op_name(), “get" ) == 0){ CORBA: : Short _par_n; CORBA:

服务器端(1)接口映射-框架实现文件 else if( strcmp( __req->op_name(), “get" ) == 0){ CORBA: : Short _par_n; CORBA: : Short _par_m; CORBA: : Long _par_value; CORBA: : Long _res; __req->add_in_arg( &_par_n ); __req->add_in_arg( &_par_m ); __req->add_in_arg( &_par_value ); __req->set_result( &_res ); if( !__req->read_args() ) return; _res = get( _par_n, _par_m, _par_value ); __req->write_results(); return; } …… }

服务器端(1)接口映射-伺服程序 头文件 class grid_impl: public virtual POA_grid{ CORBA: : Short m_height; CORBA: : Short

服务器端(1)接口映射-伺服程序 头文件 class grid_impl: public virtual POA_grid{ CORBA: : Short m_height; CORBA: : Short m_width; CORBA: : Long **m_a; grid_impl(CORBA: : Short n, CORBA: : Short m); ~grid_impl(); virtual CORBA: : Short height(); virtual void height(CORBA: : Short n);

服务器端(1)接口映射-伺服程序 头文件(续) virtual CORBA: : Short width(); virtual void width(CORBA: : Short m); virtual

服务器端(1)接口映射-伺服程序 头文件(续) virtual CORBA: : Short width(); virtual void width(CORBA: : Short m); virtual void set (CORBA: : Short n, CORBA: : Short m, CORBA: : Long value); virtual CORBA: : Long get (CORBA: : Short n, CORBA: : Short m); }

服务器端(1)接口映射-伺服程序 实现体文件(部分源码) grid_impl: : grid_impl(CORBA: : Short n, CORBA: : Short m){ m_height=n; m_width=m;

服务器端(1)接口映射-伺服程序 实现体文件(部分源码) grid_impl: : grid_impl(CORBA: : Short n, CORBA: : Short m){ m_height=n; m_width=m; m_a=new CORBA: : Long[m_height][m_width]; } CORBA: : Short grid_impl: : height(){ return m_height; } void grid_impl: : height(CORBA: : Short n){ delete m_a; m_height=n; m_a=new CORBA: : Long[m_height][m_width]; }

服务器端主程序 #include “grid_skel. hh” int main(int argc, char *argv[]) { CORBA: : ORB_var orb=

服务器端主程序 #include “grid_skel. hh” int main(int argc, char *argv[]) { CORBA: : ORB_var orb= CORBA: : ORB_init(argc, argv); CORBA: : Object_var obj= orb resolv_initial_reference(“Root. Poa”); Portable. Server: : POA_var poa= Portable. Server: : POA: : _narrow(obj); Portable. Server: : POAManager_var mgr=poa the_POAManager(); mgr activate(); grid_impl servant(6, 6); grid_var object=servant. _this(); CORBA: : string_var refstr= orb object_to_string(object); 几乎不用改动的代码行 cout<<refstr; orb->run(); } 几乎不用改动的代码行

运行程序 server. exe >objref. ior client. exe <objref. ior

运行程序 server. exe >objref. ior client. exe <objref. ior

名字服务的树状结构 : Naming Context “Stock. Watch” “Portfolio. Manager” : Naming Context “NASDAQ” : Naming

名字服务的树状结构 : Naming Context “Stock. Watch” “Portfolio. Manager” : Naming Context “NASDAQ” : Naming Context “NYSE” : Stock. Watch “Main. Admin” : PManager

名字服务的IDL定义-类型定义 module Cos. Naming{……. } struct Name. Component { string id; //目录/文件名 string kind;

名字服务的IDL定义-类型定义 module Cos. Naming{……. } struct Name. Component { string id; //目录/文件名 string kind; //扩展名 }; typedef sequence <Name. Component> Name; enum Binding. Type {nobject, ncontext}; struct Binding { Name binding_name; Binding. Type binding_type; }; typedef sequence <Binding> Binding. List;

名字服务-名字上下文 interface Naming. Context { void bind(in Name n, in Object obj); void rebind(in

名字服务-名字上下文 interface Naming. Context { void bind(in Name n, in Object obj); void rebind(in Name n, in Object obj); void bind_context( in Name n, in Naming. Context nc); void rebind_context( in Name n, in Naming. Context nc); Object resolve (in Name n); void unbind(in Name n); Naming. Context new_context(); Naming. Context bind_new_context(in Name n); void destroy( ); void list (in unsigned long how_many, out Binding. List bl, out Binding. Iterator bi);

名字服务-绑定迭代器 interface Binding. Iterator { boolean next_one(out Binding b); boolean next_n(in unsigned long how_many,

名字服务-绑定迭代器 interface Binding. Iterator { boolean next_one(out Binding b); boolean next_n(in unsigned long how_many, out Binding. List bl); void destroy(); };

名字服务使用实例 interface Account { void deposit( in unsigned long amount ); void withdraw( in

名字服务使用实例 interface Account { void deposit( in unsigned long amount ); void withdraw( in unsigned long amount ); long balance(); }; interface Bank { Account create (); };

名字服务(服务器端) Bank_impl * p. Servant = new Bank_impl; CORBA: : Object_var bank_ref= p. Servant->_this();

名字服务(服务器端) Bank_impl * p. Servant = new Bank_impl; CORBA: : Object_var bank_ref= p. Servant->_this(); CORBA: : Object_var nsobj= orb->resolve_initial_references ("Name. Service"); Cos. Naming: : Naming. Context_var nc = Cos. Naming: : Naming. Context: : _narrow (nsobj); Cos. Naming: : Name name; name. length (1); name[0]. id = CORBA: : string_dup ("Bank"); name[0]. kind = CORBA: : string_dup (""); nc->rebind (name, bank_ref);

名字服务(客户端) CORBA: : Object_var nsobj= orb resolve_initial_references ("Name. Service"); Cos. Naming: : Naming. Context_var

名字服务(客户端) CORBA: : Object_var nsobj= orb resolve_initial_references ("Name. Service"); Cos. Naming: : Naming. Context_var nc = Cos. Naming: : Naming. Context: : _narrow(nsobj) ; Cos. Naming: : Name name; name. length (1); name[0]. id = CORBA: : string_dup ("Bank"); name[0]. kind = CORBA: : string_dup (""); CORBA: : Object_var obj = nc->resolve (name);

名字服务(客户端续) Bank_var bank = Bank: : _narrow (obj); Account_var account = bank>create (); account->deposit

名字服务(客户端续) Bank_var bank = Bank: : _narrow (obj); Account_var account = bank>create (); account->deposit (700); account->withdraw (450);

事件服务层次关系 Event channel Consumer. Admin Supplier. Admin Proxy. Push. Supplier Proxy. Pull. Supplier Proxy.

事件服务层次关系 Event channel Consumer. Admin Supplier. Admin Proxy. Push. Supplier Proxy. Pull. Supplier Proxy. Push. Consumer Proxy. Pull. Consumer Push. Supplier Pull. Supplier Push. Consumer Pull. Consumer

push模型接口的IDL定义 module Cos. Event. Comm{……} interface Push. Consumer { void push (in any data);

push模型接口的IDL定义 module Cos. Event. Comm{……} interface Push. Consumer { void push (in any data); void disconnect_push_consumer(); }; interface Push. Supplier { void disconnect_push_supplier(); };

pull模型接口的IDL定义 module Cos. Event. Comm{……} interface Pull. Supplier { any pull (); any try_pull

pull模型接口的IDL定义 module Cos. Event. Comm{……} interface Pull. Supplier { any pull (); any try_pull (out boolean has_event); void disconnect_pull_supplier(); }; interface Pull. Consumer { void disconnect_pull_consumer(); };

事件通道接口的IDL定义 module Cos. Event. Channel. Admin {……} interface Event. Channel { Consumer. Admin for_consumers();

事件通道接口的IDL定义 module Cos. Event. Channel. Admin {……} interface Event. Channel { Consumer. Admin for_consumers(); Supplier. Admin for_suppliers(); void destroy(); }; interface Event. Channel. Factory { Event. Channel create_eventchannel (); };

事件服务管理接口 interface Supplier. Admin { Proxy. Push. Consumer obtain_push_consumer(); Proxy. Pull. Consumer obtain_pull_consumer(); };

事件服务管理接口 interface Supplier. Admin { Proxy. Push. Consumer obtain_push_consumer(); Proxy. Pull. Consumer obtain_pull_consumer(); }; interface Consumer. Admin { Proxy. Push. Supplier obtain_push_supplier(); Proxy. Pull. Supplier obtain_pull_supplier(); };

事件服务代理接口 interface Proxy. Push. Supplier: Cos. Event. Comm: : Push. Supplier { void connect_push_consumer(

事件服务代理接口 interface Proxy. Push. Supplier: Cos. Event. Comm: : Push. Supplier { void connect_push_consumer( in Push. Consumer push_consumer); }; interface Proxy. Push. Consumer: Cos. Event. Comm: : Push. Consumer { void connect_push_supplier( in Push. Supplier push_supplier); };

事件服务代理接口(续) interface Proxy. Pull. Supplier: Cos. Event. Comm: : Pull. Supplier { void connect_pull_consumer(

事件服务代理接口(续) interface Proxy. Pull. Supplier: Cos. Event. Comm: : Pull. Supplier { void connect_pull_consumer( in Pull. Consumer pull_consumer); }; interface Proxy. Pull. Consumer: Cos. Event. Comm: : Pull. Consumer { void connect_pull_supplier( in Pull. Supplier pull_supplier); };