1
0

wsClient.h 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381
  1. /**
  2. * @brief
  3. websocket客户端类
  4. * @version
  5. V 1.0.0
  6. * @author
  7. 王益俊
  8. * @date
  9. 创建时间: 2018-08-14\n
  10. * @note
  11. 2018-08-14 创建类。\n
  12. * @warning
  13. * @bug
  14. */
  15. #pragma once
  16. #include <string>
  17. #include <mutex>
  18. #include <condition_variable>
  19. #include <map>
  20. #include <rapidjson/writer.h>
  21. #include <rapidjson/stringbuffer.h>
  22. #include <rapidjson/prettywriter.h>
  23. #include <boost/function.hpp>
  24. #include <boost/bind.hpp>
  25. #include "sio_client.h"
  26. #include "jsonBuilder.h"
  27. namespace YA
  28. {
  29. //消息处理函数类型
  30. typedef boost::function<void( int, std::string const&, sio::message::ptr const&, bool, sio::message::list & )> MSG_HANDLE_FUNC_TYPE;
  31. class wsClient
  32. {
  33. private:
  34. sio::client __wsclient;//websocket客户端
  35. int __ID;//唯一标识
  36. std::string __uri;//连接字符串
  37. bool __Connected;//是否连接上服务器端
  38. bool __SktOpened;//Socket是否已打开
  39. bool __Logined;//是否已登录成功
  40. std::condition_variable_any __cond;//条件变量
  41. std::mutex __lock;//锁(配合__cond)
  42. std::string __LastError;//最新错误
  43. std::map<std::string, MSG_HANDLE_FUNC_TYPE> __MsgFuncList;//消息处理函数列表(key是命令,value是处理函数)
  44. std::recursive_mutex __send_lock;//发送锁
  45. jsonBuilder __jsBuilder;//json构造器
  46. protected:
  47. /**
  48. * @brief
  49. 重置状态函数。
  50. * @param 无\n
  51. * @return 无\n
  52. * @note
  53. * @warning
  54. * @bug
  55. */
  56. void _reset();
  57. /**
  58. * @brief
  59. 连接成功回调函数。
  60. * @param 无\n
  61. * @return 无\n
  62. * @note
  63. * @warning
  64. * @bug
  65. */
  66. void _on_connected();
  67. /**
  68. * @brief
  69. 连接关闭回调函数。
  70. * @param [in] sio::client::close_reason const& reason 关闭的原因\n
  71. * @return 无\n
  72. * @note
  73. * @warning
  74. * @bug
  75. */
  76. void _on_close( sio::client::close_reason const& reason );
  77. /**
  78. * @brief
  79. 重连回调函数。
  80. * @param [in] unsigned p1 ???\n
  81. * @param [in] unsigned p2 ???\n
  82. * @return 无\n
  83. * @note
  84. * @warning
  85. * @bug
  86. */
  87. void _on_reconnect( unsigned p1, unsigned p2 );
  88. /**
  89. * @brief
  90. 失败回调函数。
  91. * @param 无\n
  92. * @return 无\n
  93. * @note
  94. * @warning
  95. * @bug
  96. */
  97. void _on_fail();
  98. /**
  99. * @brief
  100. socket打开成功回调函数。
  101. * @param 无\n
  102. * @return 无\n
  103. * @note
  104. * @warning
  105. * @bug
  106. */
  107. void _on_socket_opened();
  108. /**
  109. * @brief
  110. 收到服务器端CALL命令回调函数。
  111. * @param [in] std::string const& name 触发的名字\n
  112. * @param [in] sio::message::ptr const& data 收到的消息数据\n
  113. * @param [in] bool need_ack 是否需要应答\n
  114. * @param [in] sio::message::list &ack_resp 应答消息数据\n
  115. * @return 无\n
  116. * @note
  117. * @warning
  118. * @bug
  119. */
  120. void _OnCallMessage( std::string const& name, sio::message::ptr const& data, bool need_ack, sio::message::list &ack_resp );
  121. /**
  122. * @brief
  123. 收到服务器端登录应答命令回调函数。
  124. * @param [in] std::string const& name 触发的名字\n
  125. * @param [in] sio::message::ptr const& data 收到的消息数据\n
  126. * @param [in] bool need_ack 是否需要应答\n
  127. * @param [in] sio::message::list &ack_resp 应答消息数据\n
  128. * @return 无\n
  129. * @note
  130. * @warning
  131. * @bug
  132. */
  133. void _OnLoginResponse( std::string const& name, sio::message::ptr const& data, bool need_ack, sio::message::list &ack_resp );
  134. public:
  135. wsClient();
  136. ~wsClient();
  137. /**
  138. * @brief
  139. 初始化函数。
  140. * @param [in] int ID 当前客户端的唯一标识\n
  141. * @param [in] const std::string & uri 连接串\n
  142. * @param [in] const std::map<std::string, MSG_HANDLE_FUNC_TYPE>& MsgFuncList 消息处理函数\n
  143. * @return 无\n
  144. * @note
  145. * @warning
  146. * @bug
  147. */
  148. void init( int ID, const std::string & uri, const std::map<std::string, MSG_HANDLE_FUNC_TYPE>& MsgFuncList );
  149. /**
  150. * @brief
  151. 获得连接字符串函数。
  152. * @param 无\n
  153. * @return 获得的连接字符串\n
  154. * @note
  155. * @warning
  156. * @bug
  157. */
  158. std::string get_uri();
  159. /**
  160. * @brief
  161. ;连接函数。
  162. * @param [in] int time_out 超时(单位:秒),默认是3秒\n
  163. * @return 连接服务器是否成功\n
  164. * @retval 0 成功\n
  165. * @retval -1 失败\n
  166. * @note
  167. * @warning
  168. * @bug
  169. */
  170. int connect( int time_out = 3 );
  171. /**
  172. * @brief
  173. ;登录函数。
  174. * @param 无\n
  175. * @return 无\n
  176. * @note
  177. * @warning
  178. * @bug
  179. */
  180. void login();
  181. /**
  182. * @brief
  183. 发送数据函数。
  184. * @param [in] const std::string & Cmd 要发送的命令\n
  185. * @param [in] const std::string& Data 要发送的数据\n
  186. * @return 无\n
  187. * @note
  188. * @warning
  189. * @bug
  190. */
  191. void send( const std::string & Cmd, const std::string & Data );
  192. /**
  193. * @brief
  194. 获得ID函数。
  195. * @param 无\n
  196. * @return 获得的ID\n
  197. * @note
  198. * @warning
  199. * @bug
  200. */
  201. int GetID();
  202. /**
  203. * @brief
  204. 获得是否已连接服务器端函数。
  205. * @param 无\n
  206. * @return 是否已连接服务器\n
  207. * @note
  208. * @warning
  209. * @bug
  210. */
  211. bool IsConnected();
  212. /**
  213. * @brief
  214. 获得Socket是否已打开函数。
  215. * @param 无\n
  216. * @return Socket是否已打开\n
  217. * @note
  218. * @warning
  219. * @bug
  220. */
  221. bool IsSktOpened();
  222. /**
  223. * @brief
  224. 获得是否已登录成功函数。
  225. * @param 无\n
  226. * @return 是否已登录成功\n
  227. * @note
  228. * @warning
  229. * @bug
  230. */
  231. bool IsLogined();
  232. /**
  233. * @brief
  234. 关闭函数。
  235. * @param 无\n
  236. * @return 无\n
  237. * @note
  238. * @warning
  239. * @bug
  240. */
  241. void close();
  242. /**
  243. * @brief
  244. 获得最新错误函数。
  245. * @param 无\n
  246. * @return 无\n
  247. * @note
  248. * @warning
  249. * @bug
  250. */
  251. std::string GetLastError();
  252. };
  253. }