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