LR編寫Socket腳本方法1(XML/16進制報文data.ws格式)


本文主要講述了Socket協議腳本的基礎知識和編寫方法,讓大家能夠在短時間內快速掌握簡單的Socket協議腳本的編寫方法。
1.socket協議介紹
Socket協議有萬能協議之稱,很多系統底層都是用的socket協議,用處十分廣泛。
1.1 Socket通訊方式說明
與socket通訊有兩種方式,一種是建立長連接,建立后不停的發送,接收;另一種是建立短連接,即建立連接發送報文,接收報文關閉連接
1.2 Socket協議發送的buf類型介紹
Send buffer類型分為字符串和xml類型
1.3 Socket協議腳本編寫前提:
與項目組溝通,確認是否是socket協議,由項目組提供服務器IP和端口號還有socket協議交易的報文發送及接收報文對,及交易接口文檔,了解清楚報文的數據長度,參數化字段,結構,代表什么等,了解清楚后進行socket協議腳本的開發。

1.4、Socket協議腳本函數說明及實例:

1)名稱 lrs_create_socket();  

創建socket連接,添加IP和端口號,如果創建成功返回值為0,反之則返回為非0數值。(對於長連接,建立socket連接放在vuser_init函數中,短連接放在Action中即可) 實例: lrs_create_socket("socket0","TCP","RemoteHost=180.170.150.230:7700",  LrsLastArg);

2)名稱 lrs_send();  

發送socket請求消息,取緩沖區buf0的報文並發送。

實例: lrs_send("socket0","buf1",LrsLastArg);

3)名稱 lrs_receive();

 接收socket的響應報文,放置buf1中。

實例:lrs_receive("socket0","buf2",LrsLastArg);

4)名稱 lrs_get_last_received_buffer();  

獲取最后收到的buffer和大小,其中將最后收到的buffer的值賦給RecvBuf變量,將大小賦值給RecvLen。

實例:   lrs_get_last_received_buffer("socket0",&recvBuf,&recvLen);

5)名稱 lrs_free_buffer();  

為防止內存泄露,釋放內存空間。

實例:  lrs_free_buffer(recvBuf);

6)名稱 lrs_close_socket();

 關閉Socket連接,(對於長連接,關閉socket連接應放在vuser_end函數中)

實例:  lrs_close_socket("socket0");

其他常用的Socket函數:

 lrs_set_send_buffer("socket0", sSendPkg, iLenOfPkg );//指定要發送的socket信息
lrs_get_buffer_by_name("buf0", sSendPkg, iLenOfPkg);// 獲取收到的buffer和大小
lrs_length_send("socket0","buf0",1,"Size=4","Encoding=1",LrsLastArg);
關聯函數:
lrs_save_param_ex("socket0","received","",151,7,"ascii","response");//取指定位置字符串保存到變量,以便判斷事務是否成功
lrs_save_searched_string();//在指定位置搜索字符串,將出現的字符串報錯到參數中
超時函數
lrs_set_connect_timeout();//設置連接超時時間
lrs_set_recv_timeout();//設置服務器響應超時時間
lrs_set_recv_timeout2();//設置接收超時時間,使系統不去檢查回收的內容是否一致

2、Socket腳本編寫

2.1 簡單划分步驟

這種方法是我無意在一片文章中看到的,總體說來,比較簡單。就像把大象放進冰箱一樣,總共分三步:

第一步:把冰箱門打開

//建立到服務端的連接

rc =    lrs_create_socket("socket0", "TCP", "LocalHost=0", "RemoteHost=128.64.64.23:8988", LrsLastArg);

if (rc==0)

       lr_output_message("Socket  was successfully created ");

else

       lr_output_message("An error occurred while creating the socket, Error Code: %d", rc);

第二步:把大象裝進去

lrs_send("socket0", "buf0", LrsLastArg);   //往"socket0"發送"buf0"中的數據

lrs_receive("socket0", "buf1", LrsLastArg);//將"socke0"中返回的數據存放到"buf1"中

第三步:把冰箱門帶上

 //關閉連接

 lrs_close_socket("socket0");

2.2 詳細划分步驟

◇變量的聲明與定義

◇ 創建socket連接

◇ 發送socket請求

◇ 接收socket響應

◇ 從返回Buffer 中抽取結果

◇ 結果判斷

◇ 釋放內存

◇ 斷開連接。

2.3 實例腳本

下面我們就是用一個實際項目不同報文格式的腳本進行講解;

若項目是短連接,且報文不是從文件中讀取信息時,vuser_init和vuser_end部分默認即可,主要在Action中開發測試腳本和在data.ws中傳輸數據到Action的代碼中。

Vuser_init.c

#include   "lrs.h"

vuser_init()

{

lrs_startup(257);

    return 0;

}

 


Action.c

 #include "lrs.h"

Action()

{

int rc,rv;//保存連接成功返回值

char *recvBuf;//保存接收數據的內容

int recvLen;//保存接收數據的大小

/*對於長連接,建立socket連接放在vuser_init函數中,短連接放在Action中即可*/

    rc=lrs_create_socket("socket0","TCP","RemoteHost=IP:端口",  LrsLastArg);

    //判斷連接是否創建成功

    if(rc==0){

       lr_output_message("Socket連接創建成功");

    }

    else{

       lr_error_message("Socket連接創建失敗!錯誤碼=%d",rc);

       return -1;

    }

    lr_start_transaction("XXXX_1234_FCX");//事務開始

    //發送socket請求消息(數據包內容放在data.ws中)

    lrs_send("socket0", "buf0", LrsLastArg); //取緩沖區buf0的報文並發送

    rv = lrs_receive("socket0", "buf1", LrsLastArg);//接收響應報文

    if(rv==0){

       lr_output_message("Socket接收返回消息成功");

    }

    else{

       lr_error_message("Socket接收返回消息失敗!錯誤碼=%d",rv);

       return -1;

    }

    //獲取最后收到的buffer和大小

    lrs_get_last_received_buffer("socket0",&recvBuf,&recvLen);

 

/*設置檢查點,驗證返回數據是否成功,這個根據各交易具體情況進行判斷,以下示例是通過返回值中存在000000即為成功

lrs_save_param("socket0", LRS_LAST_RECEIVED , "code", 366, 6);

if(atoi(lr_eval_string("{code}"))==000000)

if(strcmp(lr_eval_string("{code}"),"000000")==0)

*/

 

/*設置檢查點,驗證返回數據是否成功,這個根據各交易具體情況進行判斷,以下示例是通過返回報文的長度大於3即為成功*/

    if(recvLen>3){

       lr_end_transaction("XXXX_1234_FCX ",PASS);

    }

    else{

       lr_end_transaction("XXXX_1234_FCX ",FAIL);

       lr_error_message("XXXX_1234_FCX Fail!出錯信息:[%s]", recvBuf);//交易失敗時,輸出RecvBuf返回信息,用於排查出錯原因

    }

    lrs_free_buffer(recvBuf); //釋放recvBuf內存空間,否則會引起內存泄露

/*關閉Socket連接,對於長連接,關閉socket連接應放在vuser_end函數中*/

    lrs_close_socket("socket0");

    return 0;

}

 

Vuser_end.c

#include   "lrs.h"

vuser_end()

{

lrs_cleanup();

    return 0;

}

 

data.ws

1)XML報文格式

;WSRData 2 1 

send  buf0 360

"<?xmlversion=\"1.0\"encoding=\"GBK\"?>"

"<TRANINFO>"

"<HEAD>"

"<TransCode>S001</TransCode>"

"<TransDate>20170613</TransDate>"

"<TransTime>144206</TransTime>"

"<TransNo>21219603</TransNo>"

"<Operator>999088</Operator>"

"<TransInst>70090</TransInst>"

"</HEAD>"

"<MSG>"

"<CustomerID><userID></CustomerID>"

"<Type>3</Type>"

"<BusinessType>01</BusinessType>"

"</MSG>"

"</TRANINFO>"

recv buf1 300

-1

 

2)16進制報文格式

;WSRData 2 1

send  buf0 32

       "\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"

       " "

       "\x00\x00\x00\x00"

       "PID <tran>"

recv  buf1 197

       "\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"

       "\x1e\x00\x00\x00\x00"

       "STW -1"

       "\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"

       "\x1e\x00\x00\x00\x00"

       "STT "

       "\x1f"

-1

 

其中buf0代表發送的報文的名稱,后跟的數字代碼發送報文長度,其下放置發送報文;buf1代表接收報文的名稱,后跟數字代表接收報文長度,其下放置接收報文。

注意:該協議腳本參數化格式為:<參數名>

 后續:LR編寫Socket腳本方法2(從文件讀取報文)

   拼裝8543報文方法:Python學習筆記五(讀取提取寫入文件)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM