使用LR编写windows sockets协议xml报文格式脚本实战

以下是测试脚本Demo:

#include "lrs.h"

Action()
{
    char * resultCode;//结果代码
    char * time;  //系统时间
     char * errorInfo;
    int rc; 

    lr_start_transaction("事物");
    
    //设置socket连接超时时间
     lrs_set_connect_timeout(60, 0);

    rc=lrs_create_socket("socket", "TCP", "LocalHost=0", "RemoteHost=IP:port",  LrsLastArg);

    //lr_output_message("rc=%d",rc);

    if(rc != 0){
         lrs_close_socket("socket");
         lr_end_transaction("事物", LR_FAIL);
         lr_error_message("创建socket失败!");
         
        return 0;    

    }
    //发送请求buf
    lrs_send("socket", "buf2", LrsLastArg);
    
    //设置socket接受内容的超时时间,如果请求处理时间超出LR默认的120秒,将无法接收到响应内容,因此我们可以根据实际需要设置可接受的超时时间来获取响应信息。
    lrs_set_recv_timeout(300, 0);
    //接收响应buf
    lrs_receive("socket", "buf3", LrsLastArg);
    //从接收到的响应buf中截取指定字段长度,用以断言请求是否处理成功
    lrs_save_searched_string("socket",NULL,"Result","LB/BIN=<retCd>",NULL,1,0,6);
    //lrs_save_searched_string("socket",NULL,"ErrorInfo","LB/BIN=<desc>","RB/BIN=</desc>",1,0,-1);  
    //关闭socket连接
    lrs_close_socket("socket");
    
    resultCode = lr_eval_string("{Result}");
    //errorInfo =lr_eval_string("{ErrorInfo}");

    //lr_output_message("结果代码 = %s",resultCode);   

    if(strcmp(resultCode,"000000") == 0){
        lr_end_transaction("事物", LR_PASS);

    }else{
        lr_end_transaction("事物", LR_FAIL);
        
        //lr_error_message("retCd:%s ,desc:%s",resultCode,errorInfo);
        //lr_save_datetime("%Y_%m_%d %H:%M:%S", DATE_NOW + TIME_NOW, "time");
        //lr_error_message("时间 = %s",lr_eval_string("<time>"));
    }
    
   // lr_end_transaction("事物",LR_AUTO);

    return 0;
}

data.ws部分:

;WSRData 2 1     //固定格式

send  buf2 724   //发送buf长度
//报文样例 "00000724<?xml version=\"1.0\" encoding=\"UTF-8\"?>" "<transaction>" "<header>" "<ver>1.0</ver>" "<msg>" "<callTyp>1231</callTyp>" "</msg>" "</header>" "<body>" "<request>" "<ReqBaseHdr>" "<ChnlCD>er</ChnlCD>" "</request>" "</body>" "</transaction>" recv buf3 17311 //接收响应buf长度 -1 //固定格式

 data.ws部分主要介绍两点:

 1. 如何计算报文长度?

     如下所示,报文长度是8位数,当我们不知道报文精确长度时,可以给一个预估大小,然后把脚本的扩展日志3个选项都勾选上,然后执行脚本,

     查看LR控制台日志,如下图所示:

          

     从日志打印sent buffer 可以看出,报文长度我指定的是724个字节,日志提示将发送732字节到socket,也就是说724(实际报文长度)=732 - 8(8位报文长度),

     已实验多次很准, 同样的接收报文的长度计算也是如此。需要注意的是,如果你send的报文应用程序解析失败或抛异常,很可能是你报文长度计算有误导致。

     如果依然不确定长度,也可以借助UE编辑工具查看报文所占字节数,如下图所示,在UE右下角查看文件大小。或者通过查看应用日志排查是否报文发送正常。

      

    

 2.LR存放报文的格式问题:

     XML头部必须使用转义符\ 。如示例中的<?xml version=\"1.0\" encoding=\"UTF-8\"?>   

     报文 " "之间存在空格。如"<transaction>     "之间存在空格应用程序可能无法正确解析报文,这里需要注意。       

posted @ 2018-09-11 21:57  Conner&sun  阅读(577)  评论(0编辑  收藏  举报