诸暨麻将添加redis
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 
 
 
 

351 řádky
12 KiB

  1. #include "StdAfx.h"
  2. #include "ServiceUnits.h"
  3. #include "ControlPacket.h"
  4. #include "HttpThread.h"
  5. #include "google/protobuf/stubs/common.h"
  6. //////////////////////////////////////////////////////////////////////////////////
  7. //静态变量
  8. CServiceUnits * CServiceUnits::g_pServiceUnits = NULL; //对象指针
  9. //////////////////////////////////////////////////////////////////////////////////
  10. BEGIN_MESSAGE_MAP(CServiceUnits, CWnd)
  11. ON_MESSAGE(WM_UICONTROL_REQUEST, OnUIControlRequest)
  12. END_MESSAGE_MAP()
  13. //////////////////////////////////////////////////////////////////////////////////
  14. //构造函数
  15. CServiceUnits::CServiceUnits()
  16. {
  17. //设置变量
  18. m_ServiceStatus = ServiceStatus_Stop;
  19. //设置接口
  20. m_pIServiceUnitsSink = NULL;
  21. //设置对象
  22. ASSERT(g_pServiceUnits == NULL);
  23. if (g_pServiceUnits == NULL) g_pServiceUnits = this;
  24. return;
  25. }
  26. //析构函数
  27. CServiceUnits::~CServiceUnits()
  28. {
  29. ConcludeService();
  30. }
  31. //启动服务
  32. bool CServiceUnits::StartService()
  33. {
  34. Logger::GetInstance().InitDefaultLog("LoginServer", "daily_log.log");
  35. //效验状态
  36. ASSERT(m_ServiceStatus == ServiceStatus_Stop);
  37. if (m_ServiceStatus != ServiceStatus_Stop) return false;
  38. //设置状态
  39. SetServiceStatus(ServiceStatus_Config);
  40. //创建窗口
  41. if (m_hWnd == NULL)
  42. {
  43. CRect rcCreate(0, 0, 0, 0);
  44. Create(NULL, NULL, WS_CHILD, rcCreate, AfxGetMainWnd(), 100);
  45. }
  46. //配置服务
  47. if (InitializeService() == false)
  48. {
  49. ConcludeService();
  50. return false;
  51. }
  52. //启动内核
  53. if (StartKernelService() == false)
  54. {
  55. ConcludeService();
  56. return false;
  57. }
  58. //获取列表
  59. SendControlPacket(CT_LOAD_DB_GAME_LIST, NULL, 0);
  60. //启动GET请求队列
  61. CHttpClient::start(&m_AttemperEngineSink);
  62. return true;
  63. }
  64. //停止服务
  65. bool CServiceUnits::ConcludeService()
  66. {
  67. //停止GET请求队列
  68. CHttpClient::end();
  69. //设置变量
  70. SetServiceStatus(ServiceStatus_Stop);
  71. //停止服务
  72. if (m_TimerEngine.GetInterface() != NULL) m_TimerEngine->ConcludeService();
  73. if (m_AttemperEngine.GetInterface() != NULL) m_AttemperEngine->ConcludeService();
  74. if (m_DataBaseEngine.GetInterface() != NULL) m_DataBaseEngine->ConcludeService();
  75. if (m_TCPNetworkEngine.GetInterface() != NULL) m_TCPNetworkEngine->ConcludeService();
  76. if (m_TCPSocketService.GetInterface() != NULL) m_TCPSocketService->ConcludeService();
  77. //c++中使用google protobuf在关闭应用程序之前需要调用google::protobuf::ShutdownProtobufLibrary();要不然会有内存泄露
  78. google::protobuf::ShutdownProtobufLibrary();
  79. Logger::ShutDown();
  80. m_RedisClient->DisConnect();
  81. return true;
  82. }
  83. //设置接口
  84. bool CServiceUnits::SetServiceUnitsSink(IServiceUnitsSink * pIServiceUnitsSink)
  85. {
  86. //设置变量
  87. m_pIServiceUnitsSink = pIServiceUnitsSink;
  88. return true;
  89. }
  90. //投递请求
  91. bool CServiceUnits::PostControlRequest(WORD wIdentifier, VOID * pData, WORD wDataSize)
  92. {
  93. //状态判断
  94. ASSERT(IsWindow(m_hWnd));
  95. if (IsWindow(m_hWnd) == FALSE) return false;
  96. //插入队列
  97. CWHDataLocker DataLocker(m_CriticalSection);
  98. if (m_DataQueue.InsertData(wIdentifier, pData, wDataSize) == false) return false;
  99. //发送消息
  100. PostMessage(WM_UICONTROL_REQUEST, wIdentifier, wDataSize);
  101. return true;
  102. }
  103. //配置组件
  104. bool CServiceUnits::InitializeService()
  105. {
  106. //加载参数
  107. m_InitParameter.LoadInitParameter();
  108. //创建组件
  109. if ((m_TimerEngine.GetInterface() == NULL) && (m_TimerEngine.CreateInstance() == false)) return false;
  110. if ((m_AttemperEngine.GetInterface() == NULL) && (m_AttemperEngine.CreateInstance() == false)) return false;
  111. if ((m_DataBaseEngine.GetInterface() == NULL) && (m_DataBaseEngine.CreateInstance() == false)) return false;
  112. if ((m_TCPNetworkEngine.GetInterface() == NULL) && (m_TCPNetworkEngine.CreateInstance() == false)) return false;
  113. if ((m_TCPSocketService.GetInterface() == NULL) && (m_TCPSocketService.CreateInstance() == false)) return false;
  114. //组件接口
  115. IUnknownEx * pIAttemperEngine = m_AttemperEngine.GetInterface();
  116. IUnknownEx * pITCPNetworkEngine = m_TCPNetworkEngine.GetInterface();
  117. IUnknownEx * pIAttemperEngineSink = QUERY_OBJECT_INTERFACE(m_AttemperEngineSink, IUnknownEx);
  118. //数据引擎
  119. IUnknownEx * pIDataBaseEngineSink[CountArray(m_DataBaseEngineSink)];
  120. for (WORD i = 0; i < CountArray(pIDataBaseEngineSink); i++) pIDataBaseEngineSink[i] = QUERY_OBJECT_INTERFACE(m_DataBaseEngineSink[i], IUnknownEx);
  121. //内核组件
  122. if (m_TimerEngine->SetTimerEngineEvent(pIAttemperEngine) == false) return false;
  123. if (m_AttemperEngine->SetNetworkEngine(pITCPNetworkEngine) == false) return false;
  124. if (m_AttemperEngine->SetAttemperEngineSink(pIAttemperEngineSink) == false) return false;
  125. if (m_TCPNetworkEngine->SetTCPNetworkEngineEvent(pIAttemperEngine) == false) return false;
  126. if (m_DataBaseEngine->SetDataBaseEngineSink(pIDataBaseEngineSink, CountArray(pIDataBaseEngineSink)) == false) return false;
  127. //协调服务
  128. if (m_TCPSocketService->SetServiceID(NETWORK_CORRESPOND) == false) return false;
  129. if (m_TCPSocketService->SetTCPSocketEvent(pIAttemperEngine) == false) return false;
  130. //调度回调
  131. m_AttemperEngineSink.m_pInitParameter = &m_InitParameter;
  132. m_AttemperEngineSink.m_pITimerEngine = m_TimerEngine.GetInterface();
  133. m_AttemperEngineSink.m_pIDataBaseEngine = m_DataBaseEngine.GetInterface();
  134. m_AttemperEngineSink.m_pITCPNetworkEngine = m_TCPNetworkEngine.GetInterface();
  135. m_AttemperEngineSink.m_pITCPSocketService = m_TCPSocketService.GetInterface();
  136. //数据库回调
  137. for (INT i = 0; i < CountArray(m_DataBaseEngineSink); i++)
  138. {
  139. m_DataBaseEngineSink[i].m_pInitParameter = &m_InitParameter;
  140. m_DataBaseEngineSink[i].m_pIDataBaseEngineEvent = QUERY_OBJECT_PTR_INTERFACE(pIAttemperEngine, IDataBaseEngineEvent);
  141. }
  142. //配置网络
  143. WORD wMaxConnect = m_InitParameter.m_wMaxConnect;
  144. WORD wServicePort = m_InitParameter.m_wServicePort;
  145. if (m_TCPNetworkEngine->SetServiceParameter(wServicePort, wMaxConnect, szCompilation) == false) return false;
  146. //连接redis
  147. m_RedisClient = std::make_shared<RedisBase>();
  148. m_RedisClient->Connect(m_InitParameter.m_RedisHost, m_InitParameter.m_RedisPort, m_InitParameter.m_RedisDb, m_InitParameter.m_RedisTimeOut, m_InitParameter.m_RedisMaxReconnect, m_InitParameter.m_RedisReconnectInterval);
  149. m_AttemperEngineSink.m_RedisClient = m_RedisClient;
  150. return true;
  151. }
  152. //启动内核
  153. bool CServiceUnits::StartKernelService()
  154. {
  155. //时间引擎
  156. if (m_TimerEngine->StartService() == false)
  157. {
  158. ASSERT(FALSE);
  159. return false;
  160. }
  161. //调度引擎
  162. if (m_AttemperEngine->StartService() == false)
  163. {
  164. ASSERT(FALSE);
  165. return false;
  166. }
  167. //数据引擎
  168. if (m_DataBaseEngine->StartService() == false)
  169. {
  170. ASSERT(FALSE);
  171. return false;
  172. }
  173. //协调引擎
  174. if (m_TCPSocketService->StartService() == false)
  175. {
  176. ASSERT(FALSE);
  177. return false;
  178. }
  179. return true;
  180. }
  181. //启动网络
  182. bool CServiceUnits::StartNetworkService()
  183. {
  184. //网络引擎
  185. if (m_TCPNetworkEngine->StartService() == false)
  186. {
  187. ASSERT(FALSE);
  188. return false;
  189. }
  190. return true;
  191. }
  192. //设置状态
  193. bool CServiceUnits::SetServiceStatus(enServiceStatus ServiceStatus)
  194. {
  195. //状态判断
  196. if (m_ServiceStatus != ServiceStatus)
  197. {
  198. //错误通知
  199. if ((m_ServiceStatus != ServiceStatus_Service) && (ServiceStatus == ServiceStatus_Stop))
  200. {
  201. LPCTSTR pszString = TEXT("服务启动失败");
  202. CTraceService::TraceString(pszString, TraceLevel_Exception);
  203. }
  204. //设置变量
  205. m_ServiceStatus = ServiceStatus;
  206. //状态通知
  207. ASSERT(m_pIServiceUnitsSink != NULL);
  208. if (m_pIServiceUnitsSink != NULL) m_pIServiceUnitsSink->OnServiceUnitsStatus(m_ServiceStatus);
  209. }
  210. return true;
  211. }
  212. //发送控制
  213. bool CServiceUnits::SendControlPacket(WORD wControlID, VOID * pData, WORD wDataSize)
  214. {
  215. //状态效验
  216. ASSERT(m_AttemperEngine.GetInterface() != NULL);
  217. if (m_AttemperEngine.GetInterface() == NULL) return false;
  218. //发送控制
  219. m_AttemperEngine->OnEventControl(wControlID, pData, wDataSize);
  220. return true;
  221. }
  222. //控制消息
  223. LRESULT CServiceUnits::OnUIControlRequest(WPARAM wParam, LPARAM lParam)
  224. {
  225. //变量定义
  226. tagDataHead DataHead;
  227. BYTE cbBuffer[MAX_ASYNCHRONISM_DATA];
  228. //提取数据
  229. CWHDataLocker DataLocker(m_CriticalSection);
  230. if (m_DataQueue.DistillData(DataHead, cbBuffer, sizeof(cbBuffer)) == false)
  231. {
  232. ASSERT(FALSE);
  233. return NULL;
  234. }
  235. //数据处理
  236. switch (DataHead.wIdentifier)
  237. {
  238. case UI_LOAD_DB_LIST_RESULT: //列表结果
  239. {
  240. //效验消息
  241. ASSERT(DataHead.wDataSize == sizeof(CP_ControlResult));
  242. if (DataHead.wDataSize != sizeof(CP_ControlResult)) return 0;
  243. //变量定义
  244. CP_ControlResult * pControlResult = (CP_ControlResult *)cbBuffer;
  245. //失败处理
  246. if ((m_ServiceStatus != ServiceStatus_Service) && (pControlResult->cbSuccess == ER_FAILURE))
  247. {
  248. ConcludeService();
  249. return 0;
  250. }
  251. //成功处理
  252. if ((m_ServiceStatus != ServiceStatus_Service) && (pControlResult->cbSuccess == ER_SUCCESS))
  253. {
  254. //连接协调
  255. SendControlPacket(CT_CONNECT_CORRESPOND, NULL, 0);
  256. }
  257. return 0;
  258. }
  259. case UI_CORRESPOND_RESULT: //协调结果
  260. {
  261. //效验消息
  262. ASSERT(DataHead.wDataSize == sizeof(CP_ControlResult));
  263. if (DataHead.wDataSize != sizeof(CP_ControlResult)) return 0;
  264. //变量定义
  265. CP_ControlResult * pControlResult = (CP_ControlResult *)cbBuffer;
  266. //失败处理
  267. if ((m_ServiceStatus != ServiceStatus_Service) && (pControlResult->cbSuccess == ER_FAILURE))
  268. {
  269. ConcludeService();
  270. return 0;
  271. }
  272. //成功处理
  273. if ((m_ServiceStatus != ServiceStatus_Service) && (pControlResult->cbSuccess == ER_SUCCESS))
  274. {
  275. //启动网络
  276. if (StartNetworkService() == false)
  277. {
  278. ConcludeService();
  279. return 0;
  280. }
  281. //设置状态
  282. SetServiceStatus(ServiceStatus_Service);
  283. }
  284. return 0;
  285. }
  286. }
  287. return 0;
  288. }
  289. //////////////////////////////////////////////////////////////////////////////////