rabbitclient.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  1. #include "rabbitclient.h"
  2. #include <QDir>
  3. #include <QString>
  4. #include <QIODevice>
  5. #include <QFile>
  6. #include <QMessageBox>
  7. #include <QBuffer>
  8. #include <QJsonParseError>
  9. #include <QDebug>
  10. #include <QJsonDocument>
  11. rabbitClient::rabbitClient(QObject *parent) : QObject(parent)
  12. {
  13. }
  14. /*
  15. * @brief: the constructor
  16. * @param: type "recvClient" "sendClient"
  17. * @ret: void
  18. * @birth: created by czm in 20230327
  19. */
  20. rabbitClient::rabbitClient(QString type)
  21. {
  22. if(type=="recvClient"){
  23. initRecv();
  24. }else if(type =="sendClient")
  25. {
  26. initSend();
  27. }else{
  28. }
  29. }
  30. /*
  31. * @brief: the destructor
  32. * @param: void
  33. * @ret: void
  34. * @birth: created by czm in 20230327
  35. */
  36. rabbitClient::~rabbitClient()
  37. {
  38. disconnect();
  39. if(rconf){
  40. delete rconf;
  41. rconf = NULL;
  42. }
  43. if(objRabbitmq)
  44. {
  45. delete objRabbitmq;
  46. objRabbitmq = NULL;
  47. }
  48. }
  49. /**********************************************
  50. * 发送 单个消息 参数传递 消息内容和状态
  51. *
  52. * ********************************************/
  53. int rabbitClient::sendMsg(const std::string str)
  54. {
  55. printf("-------------rabbit client sendmsg----------------------\n");
  56. int iRet;
  57. amqp_basic_properties_t properties = {};
  58. CMessage cmsg(str, properties, objRabbitmq->routing_keys_name);
  59. iRet = objRabbitmq->PublishMessage(cmsg, ErrorReturn);
  60. if(iRet!=0){
  61. cout<<"Send Rabbitmq publish Message : "<<ErrorReturn <<endl;
  62. disconnect_index++;
  63. if(disconnect_index == 15){
  64. connection_state = false;
  65. disConnect();
  66. emit restart_send_client_signal();//信号
  67. return -1;
  68. }
  69. }else {
  70. disconnect_index = 0;
  71. }
  72. QThread::sleep(1);
  73. return 0;
  74. }
  75. /************************************************
  76. * 接收单个 消息 参数 传递接收消息的 str 和状态
  77. * 接收失败15次,即判断连接失败,断开连接,否则,每次重置统计接收失败次数
  78. * *********************************************/
  79. int rabbitClient::recvMsg()
  80. {
  81. int iRet;
  82. std::string str;
  83. while(true){
  84. iRet = objRabbitmq->ConsumerMessage(str,
  85. objRabbitmq->queue_name,
  86. ErrorReturn);
  87. if(iRet!= 0){
  88. cout<<"Recv Rabbitmq consumer Message : "<<ErrorReturn <<endl;
  89. disconnect_index++;
  90. if(disconnect_index == 15){
  91. connection_state = false;
  92. disConnect();
  93. emit restart_recv_client_signal();//信号
  94. return -1;
  95. }
  96. }
  97. disconnect_index = 0;
  98. if(str!=""){
  99. str.erase(0,1);//删除首尾双引号
  100. str.erase(str.end()-1);
  101. std::string t;
  102. for (int var = 0; var < str.length(); ++var) {
  103. if(str[var]=='\\'){//第一次删除"\\"
  104. }else{
  105. t+=str[var];
  106. }
  107. }
  108. t.erase(0,1);//暂时移除首尾{}
  109. t.erase(t.end()-1);
  110. //-------------去除param数组里面的多余转义字符-------------------//
  111. int temp1 = t.find_first_of('[');
  112. int temp2 = t.find_first_of(']');
  113. if(-1 != temp1){//param包含数组
  114. string array_first_t;
  115. array_first_t = t.substr(0,temp1);
  116. string array_end_t;
  117. array_end_t = t.substr(temp2+1);
  118. int num_temp1 = array_first_t.find_first_of('{');
  119. if(num_temp1!=-1){//param非数组,但包含数组 //json数据格式*******{****************[{*****},{*****}]*****}*********
  120. string array_second_t;
  121. string array_third_t;
  122. string array_middle_t;
  123. string temp_str = array_first_t;
  124. array_first_t = array_first_t.substr(0,num_temp1);//*******
  125. array_second_t = temp_str.substr(num_temp1);//{*********
  126. temp_str = array_end_t;
  127. int num_temp2 = array_end_t.find_first_of('}');
  128. array_end_t = array_end_t.substr(num_temp2);//}*******
  129. array_third_t = temp_str.substr(0,num_temp2);//******
  130. temp_str.clear();
  131. for(int i=0;i<array_second_t.size();i++){
  132. if(array_second_t[i]=='"'){
  133. temp_str+='\\';
  134. }
  135. temp_str+=array_second_t[i];
  136. }
  137. array_second_t = temp_str;
  138. temp_str.clear();
  139. for(int i=0;i<array_third_t.size();i++){
  140. if(array_third_t[i]=='"'){
  141. temp_str+='\\';
  142. }
  143. temp_str+=array_third_t[i];
  144. }
  145. array_third_t = temp_str;
  146. for(int i=temp1;i<=temp2;i++){
  147. if(t[i] =='"'){
  148. array_middle_t+='\\';
  149. array_middle_t+='\\';
  150. array_middle_t+='\\';
  151. }
  152. array_middle_t+=t[i];//[{*******},{******}]
  153. }
  154. t='{'+array_first_t+array_second_t+array_middle_t+array_third_t+array_end_t+'}';
  155. }else{//param数组 //json数据格式*************[{******},{*******},{******}]***************
  156. string array_middle_t;
  157. for(int i = temp1;i<=temp2;i++){
  158. if(t[i] == '"'){
  159. array_middle_t += '\\';
  160. }
  161. array_middle_t+=t[i];
  162. }
  163. t.clear();
  164. t = '{' + array_first_t+array_middle_t+array_end_t+'}';
  165. }
  166. }else{//param不包含数组 //json数据格式*****************{**********}*****************
  167. //-----------去除paramjson里面的多余转义字符--------------------//
  168. int num1 = t.find_first_of('{',0);
  169. int num2 = t.find_first_of('}',0);
  170. int num3 = t.find_last_of('}',0);
  171. if(num2 == num3){//*****************{**********}*****************
  172. if(num1!=-1){
  173. string first_t;
  174. first_t=t.substr(0,num1);
  175. string middle_t;
  176. for(int i=num1;i<=num2;i++){
  177. if(t[i] == '"'){
  178. middle_t+='\\';
  179. }
  180. middle_t+=t[i];
  181. }
  182. string end_t;
  183. end_t = t.substr(num2+1);
  184. t.clear();
  185. t = '{' + first_t + middle_t + end_t + '}';
  186. }else{
  187. t = '{' + t + '}';
  188. }
  189. }else{//**********{*******{******}**{******}**{******}}**********
  190. string array_first_t,array_end_t,array_middle_t;
  191. string original_t,last_t;
  192. original_t = t;
  193. array_first_t = t.substr(0,num1+1);//*********{ //t=*******{******}**{******}**{******}}**********
  194. t = original_t;
  195. array_end_t = t.substr(num3);//}***********
  196. array_middle_t = original_t.substr(num1+1,num3-num1-1);//****{*****}**{****}**{****}**
  197. bool judge_flag = false;
  198. for(int i=0;i<array_middle_t.size();i++){
  199. if(!judge_flag){
  200. if(array_middle_t[i]== '"'){
  201. last_t += '\\';
  202. }else if(array_middle_t[i] == '{'){
  203. judge_flag = true;
  204. }
  205. last_t+=array_middle_t[i];
  206. }else{
  207. if(array_middle_t[i]== '"'){
  208. last_t += '\\';
  209. last_t += '\\';
  210. last_t += '\\';
  211. }else if(array_middle_t[i] == '}'){
  212. judge_flag = false;
  213. }
  214. last_t+=array_middle_t[i];
  215. }
  216. }
  217. t = '{'+array_first_t+last_t+array_end_t+'}';
  218. }
  219. }
  220. emit sendmsg_recvclientToRecvstate(t);//信号*/
  221. //0509
  222. //emit sendmsg_recvclientToRecvstate(tmp);
  223. }
  224. QThread::sleep(1);
  225. }
  226. return 0;
  227. }
  228. /*
  229. * @brief: init recvClient(初始化接收客户机)
  230. * @param: void
  231. * @ret: void
  232. * @birth: created by czm in 20230327
  233. */
  234. void rabbitClient::initRecv()
  235. {
  236. rconf = new ReadConf();
  237. QString path = QDir::currentPath()+"/"+RECVCONFPATH;
  238. ReadConf rconf_;
  239. rconf->Read_Conf(path.toStdString(),rconf_);
  240. objRabbitmq = new CRabbitMqClient(rconf_.host,
  241. rconf_.port,
  242. rconf_.userName,
  243. rconf_.password,
  244. NULL,
  245. rconf_.channel_id,
  246. rconf_.queue_name,
  247. rconf_.exchange_name,
  248. rconf_.keys_name);
  249. recv_connect();
  250. }
  251. /*
  252. * @brief: init sendClient(初始化发送客户机)
  253. * @param: void
  254. * @ret: void
  255. * @birth: created by czm in 20230327
  256. */
  257. void rabbitClient::initSend()
  258. {
  259. rconf = new ReadConf();
  260. QString path = QDir::currentPath()+"/"+SENDCONFPATH;
  261. ReadConf rconf_;
  262. rconf->Read_Conf(path.toStdString(),rconf_);
  263. objRabbitmq = new CRabbitMqClient(rconf_.host,
  264. rconf_.port,
  265. rconf_.userName,
  266. rconf_.password,
  267. NULL,
  268. rconf_.channel_id,
  269. rconf_.queue_name,
  270. rconf_.exchange_name,
  271. rconf_.keys_name);
  272. send_connect();
  273. }
  274. /*
  275. * @brief: disconnect Client(断开连接)
  276. * @param: void
  277. * @ret: int 0-success other-fail
  278. * @birth: created by czm in 20230327
  279. */
  280. int rabbitClient::disConnect()
  281. {
  282. int ret = objRabbitmq->DisConnect(ErrorReturn);
  283. return ret;
  284. }
  285. /*
  286. * @brief: connect recv Client(接收客户机连接)
  287. * @param: void
  288. * @ret: int 0-success other-fail
  289. * @birth: created by czm in 20230327
  290. */
  291. void rabbitClient::recv_connect()
  292. {
  293. int iRet = objRabbitmq->Connect(ErrorReturn);
  294. if(iRet != 0){
  295. connection_state = false;
  296. emit restart_recv_client_signal();//信号
  297. cout<<iRet<<endl;
  298. cout<<"Recv Rabbitmq Connect : "<<ErrorReturn<<endl;
  299. return;
  300. }
  301. connection_state = true;
  302. // CExchange my_exchange(objRabbitmq->exchange_name);
  303. // iRet = objRabbitmq->DeclareExchange(my_exchange,
  304. // ErrorReturn);
  305. // if(iRet!=0){
  306. // cout<<iRet<<endl;
  307. // cout<<"Recv Rabbitmq ExchangeDeclare : "<<ErrorReturn<<endl;
  308. // }
  309. // CQueue my_Queue(objRabbitmq->queue_name);
  310. // iRet = objRabbitmq->DeclareQueue(my_Queue,
  311. // ErrorReturn);
  312. // if(iRet!=0){
  313. // cout<<iRet<<endl;
  314. // cout<<"Recv Rabbitmq QueueDeclare : "<<ErrorReturn<<endl;
  315. // }
  316. // iRet = objRabbitmq->BindQueueToExchange(my_Queue, my_exchange,
  317. // objRabbitmq->routing_keys_name,
  318. // ErrorReturn);
  319. // if(iRet!=0){
  320. // cout<<iRet<<endl;
  321. // cout<<"Recv Rabbitmq QueueBind : "<<ErrorReturn<<endl;
  322. // }
  323. disconnect_index =0;
  324. }
  325. /*
  326. * @brief: connect send Client(连接发送客户机)
  327. * @param: void
  328. * @ret: int 0-success other-fail
  329. * @birth: created by czm in 20230327
  330. */
  331. void rabbitClient::send_connect()
  332. {
  333. int iRet = objRabbitmq->Connect(ErrorReturn);
  334. if(iRet != 0){
  335. connection_state = false;
  336. emit restart_send_client_signal();//信号
  337. cout<<iRet<<endl;
  338. cout<<"Send Rabbitmq Connect : "<<ErrorReturn<<endl;
  339. return;
  340. }
  341. connection_state = true;
  342. // CExchange my_exchange(objRabbitmq->exchange_name);
  343. // iRet = objRabbitmq->DeclareExchange(my_exchange,ErrorReturn);
  344. // if(iRet!=0){
  345. // cout<<iRet<<endl;
  346. // cout<<"Send Rabbitmq ExchangeDeclare : "<<ErrorReturn<<endl;
  347. // }
  348. // CQueue my_Queue(objRabbitmq->queue_name);
  349. // iRet = objRabbitmq->DeclareQueue(my_Queue, ErrorReturn);
  350. // if(iRet!=0){
  351. // cout<<iRet<<endl;
  352. // cout<<"Send Rabbitmq QueueDeclare : "<<ErrorReturn<<endl;
  353. // }
  354. // iRet = objRabbitmq->BindQueueToExchange(my_Queue, my_exchange, objRabbitmq->routing_keys_name, ErrorReturn);
  355. // if(iRet!=0){
  356. // cout<<iRet<<endl;
  357. // cout<<"Send Rabbitmq QueueBind : "<<ErrorReturn<<endl;
  358. // }
  359. disconnect_index = 0;
  360. }