TUXEDO会话通信的编程方法

来源:互联网 发布:linux vim强制退出 编辑:程序博客网 时间:2024/05/17 22:03

 TUXEDO有会话通信方式,这种方式比较适合大批量数据的传输

1)Server端
        1. 对于大批量数据的传输,建议使用一个变量来记录当前的数据条数,达到一定的条数后,即可把数据返回给客户端程序。
        2. 使用循环来发送数据,在发送给客户端数据时,使用tpsend这个函数,如:
           ret = tpsend(rqst->cd, (char *)oBuf, 0, TPRECVONLY, &revent);
           TPRECVONLY这个常量,表示server在发送完oBuf中的数据后,变成只能接收数据。同时Client端会产生TPEV_SENDONLY事件。
        3. 在发送完数据后,由于被阻塞,要是用tprecv来进行监听,收到客户端的消息后,立即开始下一批数据的传送。调用tcprecv之后,server端在收到cilent发来的消息之前,一直处于阻塞状态。          
           ret = tprecv(rqst->cd, (char **)&oBuf, &oBufLen, TPNOCHANGE, &revent);
        4. 反复上述2、3过程,即可完成数据的会话式传送。
        5. 在最后,返回一个TPSUCCESS状态给Client端。
           tpreturn(TPSUCCESS, 0, NULL, 0L, 0);
           这样的话,客户端可以根据tprecv的返回值来判断Server端是否把数据全部发送完毕,判断的条件为:
           ret == -1 && tperrno==TPEEVENT && revent==TPEV_SVCSUCC
 
   (2)Client端
       Client端和Server基本上一样,在流程上是相反的。
       1. 由于采用会话方式调用TUXEDO服务,那么在客户端连接服务时不能使用tpcall,而是使用tpconnect来进行。
          connectId = tpconnect("XXXX", (char *)oBuf, len, PRECVONLY|TPSIGRSTRT);
          表示连接XXXX服务,如果成功,返回值connectId是该连接的标识符,否则为-1。
       2. 客户端使用循环的方式调用tcprecv,是客户端进入阻塞状态,等待数据的传输。
          ret = tprecv(connectId, (char**)&iBuf, &iBufLen, TPNOCHANGE, &revent);
          在收到数据后,要对tcprecv的返回值进行检查。
          ret == -1 && tperrno==TPEEVENT && revent==TPEV_SVCSUCC
          如果以上条件被满足,则表示数据已经传输完毕,即可退出循环。
          ret == -1 && revent == TPEV_SENDONLY
          如果该条件被满足,则表示有数据传输进来,可以对数据进行分析处理。
          ret == -1 && tperrno!=TPEEVENT 这个条件可以用来判断tprecv调用是否出现问题。
       3. 在对数据处理完毕后,Client端要向Server端发送索要下一批数据的消息。如果和Server端无数据交互的话,可以使用一下的方法:
          tpsend(connectId, NULL, 0, TPRECVONLY, &revent);
          该函数调用后,会在Server端会产生一个TPEV_SENDONLY的事件,那Server端就可以根据收到该事件继续发送下一批数据。
       4. 通过以上的反复过程,即可完成Client端对Server端的数据的接收。
 
   经过实际编程实现,积累了对TUXEDO会话通信方式的认识。个人对编程模式简单总结为:
   Server:  Fget();       /* 获取Client端初始送来的数据,常用于数据查询条件等 */
            while(1) {
              ......
              Fadd();     /* 将数据压入缓冲区 */
              tpsend();   /* 发送缓冲区的数据给Client,会在Client端产生TPEV_SENDONLY事件 */
              ......;
              tprecv();   /* 阻塞,监听是否有来自Client端的数据 */
            }
            tpreturn(TPSUCCESS, 0 ,NULL, 0, 0);  /* 使得Client断能够产生TPEV_SVCSUCC事件,以便Client能够退出循环,程序结束退出 */            
 
   Client:  tpconnect();  /* 连接服务 */
            tpsend();     /* 初始发送给服务的数据 */
            while(1) {
              tprecv();   /* 阻塞,监听是否有来自Server端的数据 */
              ......
              tpsend();   /* 发送空数据给Server,在Server端产生TPEV_SENDONLY事件 */
            }