一种远程对象调用方法

1.是否有用
在完成之后,我用他写了几个例子.
1. X_CORBA_HELLE_WORLD.exe, 运行bin目录hello_world_server.bat,
或者运行X_CORBA_SERVER_USER_DLL.exe就是启动了服务程序,直接双击就是客户程序,可以看到效果.
2. X_CORBA_TransFile.exe 命令行输入 –help可以看到帮助文件,或者直接看源码就知道怎么用了,传输文件效力不是很理想,一个1.8G的文件需要近5分钟..运行X_CORBA_SERVER_USER_DLL.exe
也能运行服务端进程
3. X_CORBA_SERVER_USER_DLL, X_CORBA可以将服务端代码编译到一个dll中,然后在一个exe中调用.这个功能可以扩展服务程序的功能.
4.为了足够显示分布式系统的概念,最后一个例子我写了一个聊天系统包括若干个可执行程序.
   a.  X_CORBA_CHAR_Client.exe .聊天客户端.这里为了简单都是控制台程序.
       还有一点.我生产功能的时候有个错误,把CHAT错误的写成CHAR了,下同!
b. X_CORBA_CHAR_Config_Server.exe 服务端负责配置的服务器.
c. X_CORBA_CHAR_Room_Alloc.exe 聊天室分配服务器,
d. X_CORBA_CHAR_Server_Register.exe,用户注册服务器,用来登记在线用户的信息.用户在哪个聊天室,聊天室中的session id.
e. X_CORBA_CHAR_Msg_Route.exe, 路由在不同聊天室中的client的聊天记录.这样的话,在不同的两个聊天室里的用户也能聊天.这对用户来说是透明的.
f. X_CORBA_CHAR_Server_Room.exe, 聊天室.
 
 
   
说明:1,程序的启动有先后先启动
Config_Server,Room_Alloc,Register_Server,Msg_Route,Room_Server,然后Client可以连接了!运行之后,还算可以能chat,只是没有大规模测试,事实上我只有在两台计算机商运行过.简单说明一下各个程序的功能,
Config_Server,主要是保存各个程序的配置,主要配置是其他程序的地址,当其他程序启动的时候,都要告诉Config_Server它的地址,所有,Config_Server必须首先运行.而且由于Config_Server在整个系统运行的过程中和其他程序的交互并不频繁,所有我认为,整个系统只要运行一个Config_Server进程就可以了.
Room_Alloc是聊天室分配的进程,分配基数从1000开始,对一个地址分配一个id比如1001,1002,Room_Server启动的时候请求Room_Alloc得到room_id, 它拥有所有聊天室的地址,和其他交换的程序有Msg_Route下面介绍.
Register_Server,用来记录所有用户的登陆,和其他信息,包括聊天用户的friend,用户所在的room_id,和room_id中的session_id,还有当用户退出的时候,试图通知其所有聊过天的friend.
Msg_Route,用来路由在不同聊天室里两个client的消息,它需要通过Room_Alloc得到某个room_id中地址,或者说通讯对象.真正的系统中应该有一个Msg_Route组来完成大量的频繁的用户消息转发.
Room_Server用来接受用户,和其发过来的信息,发现聊天对方不再该聊天室,会通知Msg_Route转发其聊天信息.
整个过程就是这样.可能有点复杂,也可能并不复杂. 没有大规模测试过.强调一下,我不是要做这个聊天系统,而是要应用X_CORBA.
运行系统,只要运行对于的bat文件就可以了,bat文件又序号的!
 
2,是否好用
 a.介绍一下,xcorba_idl.exe
       和CORBA一样,这个也有个idl转换的工具,叫xcorba_idl.exe ,语法类似但更简单.接受文件后缀是xidl的文件!
         内置数据类型:
void,bool8,char8,uint8,int16,uint16,int32,uint32,float32,double64,
bool8seq,char8seq,uint8seq,int16seq,uint16seq,int32seq,uint32seq,float32seq,double64seq,
前面的一看就知道,后面的,后缀是seq的是对于类型的序列化.
除了上面的数据类型,还可以自定义数据类型.通过使用关键字:
struct, class, interface.这个3个的功能略有不同.struct只能定义一个公用部分的结构,不会产生客户端&服务端代码.interface定义接口,可以有成员变量,可以有成员函数,不能继承,class除了interface的功能,还能继承,interface和class定义的新类型, 也可以将自定义的数据类型序列化.可以参照上面的例子.
include用来包含其他xidl文件,语法 如 #include “test.xidl”
namespace, 功能和语法与C++ 一样
其他:
              “ { } ( ) ; : # . , // /* */ & * 
C++ 一样
例子中有相关例子.
 
 b.对生产文件的介绍和使用
       使用方法 可以输入 xcorba_idl.exe -h    查看帮助,很简单.
       产生的文件默认情况下, 会有comm , client_stub, server_skel文件夹,如果要编写client端程序只要包含client_stub中的相关文件,如果要写server端的程序,就要包含comm,和server_skel文件.客户端调用有若干中方法
       Client端:
       1,首先建立XCORBA的运行环境;
              XCORBA_Environment __orb_comm_init; 
              X_CORBA_Initialize();
              if (!__orb_comm_init.startup())
              {
                     return error;
              }
      
       2,建立服务端的连接;
           XCORBA_Client __client;  
              if (!__client.orb_init(ip, port))
              {
                     return error;
              } 
       3,调用远程方法:
    A.Client端的调用, 比如有 Test_Stub ,有个函数 int print();
              调用1: Test_Stub __test;       // 1
                            __test.bind(__client);   // 2
                            __test.print();         // 3
        这种调用我叫它简单方法调用.和那个soap不一样哦. 调用过程: 在server端有个对应Test_Skel对象的集合,或者叫对象池,当收到client端的 __test.print()的时候,会在这个池中找一个空的对象,(这个过程是不用遍历池来寻找,所有基本不耗时),然后调用server的方法,返回之后这个对象立即返回到对应的池中.这个时候,client就会收到return 的int 值了.这种简单调用的方法是基本的方法.当然除了有print函数还可以有其他的函数,甚至还可以有成员变量,也可以工作很好.
       
              调用2: Test_Stub __test(__client);       // 1
                            __test.print();                              //2
              可以看到将调用1中的步骤1和2合并起来了,区别在哪里呢,这个我在例子
X_CORBA_TransFile.exe中这么调用了,区别在于,在整个__test的生命域内,都对应server端的一个Test_Skel, 这中方法我叫他hold call , 真不知道这么叫它,这中方法需要更加安全的改进,针对某些特殊的情况.
 
              调用3: 异步调用, 在调用xcorba_idl.exe –C 的时候,会产生异步调用的方法.事实上针对一个方法,会有两个方法生产,一个是调用的方法,一个是异步应答的方法,如果那个调用的方法有应答的话,所有对那些返回是void的函数是不会生产异步调用的方法.
       比如有函数: uint32 print1(uint32    a);
       会产生:
       public:             
              void print1_asyn(uint32 a);
       private:             
              void on_print1_uint32(const char8* _rev,uint32 _size);
 
以上是3中调用方法,详细的可以看一下生产Stub文件的cpp文件的区别.还有看一下上面介绍的几个例子.
       B. Server调用
       1,首先建立XCORBA的运行环境;
              XCORBA_Environment __orb_comm_init;  
              if (!__orb_comm_init.startup())
              {
                     return error;
              }
       2,调用X_CORBA_Initialize();
   
3,设置某些服务端对象.比如,Test_Skel
        需要操作一个全局的 Config对象. __config.
        那么可以这么做.修改生成的Test_Skel 增加 Config成员变量
              Test_Skel  __test(__config);
              if (!X_CORBA_Bind_Skel("namespace::Test ",&__test))
              {
                     break;
              }
Namespace是对象在的名字空间,如果它又的话!
              通过这中方法可以将池中的对象池外面交互,另外的交互的方法我用的是singten模式.
              肯定还有更好的其他方法.
          4,建立服务对象.
XCORBA_Server        __OrbServer;  
              if (!__OrbServer.orb_init(ip, port))
              {
                     return error;
              } 
              __OrbServer.orb_run(false); //false是非阻塞,true是阻塞
              OK,到这个时候服务建立了.调用 __OrbServer.stop() 结束服务
 
3.是否能用

 希望能用. 整个这些,都是建立在我一个人的思想上建立起来的,我不知道在某些我未预料的情况下,是否能工作良好.如果你做过和网络有关的应用,你会发现要想它能像你预料的那些工作是很困难的,情况总是比你预料的还要多.会在程序就是这个样子. 虽然开始都是有计划的,但后期都是很混乱的. 如果做程序就像是吃汉堡一样,吃完了一个,下面的事就是考虑吃下一个呢,还是休息一下.那做程序真实比睡觉还要舒服的事情.
   如果看到这份文档的朋友,有兴趣的话,可以使用一下,若发现有什么不对,或不妥的地方可以通知我. 希望这个东西能用.这个是我做的自己比较满意的东西.
 
4.其他
       确实,这个和CORBA相比差太多了,CORBA的思想是可以把网络编程更简单,做分布式系统更加简单,事实上真的以OO的思想来做网络的应用,是很简单的,就像你看到的例子.呵呵 . 话说回来,例子中的调用也不是很好,还有又很大的余地改进的.
       写程序是科技发展的产物,但我们却在用比较原始的方法在工作.希望能做的更好.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值