• 使用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>     "之间存在空格应用程序可能无法正确解析报文,这里需要注意。       

  • 相关阅读:
    4月22日:毕业设计计划
    4月21日:毕业设计计划
    4月11日:毕业设计计划
    4月9日:毕业设计计划
    4月8日:毕业设计计划
    4月2日:毕业设计计划
    4月1日:毕业设计计划
    3月31日:毕业设计计划
    3月30日:毕业设计计划
    3月28日:毕业设计计划
  • 原文地址:https://www.cnblogs.com/ssj0723/p/9630639.html
Copyright © 2020-2023  润新知