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事件 */
}