Skip to content

Commit 613d2df

Browse files
authored
Merge pull request #2 from libxengine/develop
V1.3版本分支发布合并
2 parents b3f734f + 478e685 commit 613d2df

17 files changed

Lines changed: 409 additions & 18 deletions

File tree

README.en.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ this software support following features
2121
8. message get time
2222
9. message subcribe
2323
10. support Permission Validation(planning)
24-
11. Active delivery acquisition mode or passive subscription notification module
24+
11. support multi protocol(TCP,HTTP,WEBSOCKET)
25+
12. Active delivery acquisition mode or passive subscription notification module
2526

2627
## install
2728

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ c c++Message Queue Service
2020
8. 消息次数
2121
9. 消息订阅
2222
10. 支持权限验证(planning)
23-
11. 主动投递获取模式或者被动订阅通知模块
23+
11. 支持多种协议(TCP,HTTP,WEBSOCKET)
24+
12. 主动投递获取模式或者被动订阅通知模块
2425

2526
## 安装教程
2627

XEngine_Docment/Docment_en.docx

344 Bytes
Binary file not shown.

XEngine_Docment/Docment_zh.docx

-88 Bytes
Binary file not shown.

XEngine_Release/XEngine_Config/XEngine_Config.json

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,22 @@
44
"bDeamon": 0,
55
"nTCPPort": 5200,
66
"nHttpPort": 5201,
7+
"nWSPort": 5202,
78
"XMax": {
89
"nMaxClient": 10000,
910
"nMaxQueue": 10000,
1011
"nIOThread": 2,
1112
"nTCPThread": 2,
12-
"nHttpThread": 2
13+
"nHttpThread": 2,
14+
"nWSThread": 2
1315
},
1416
"XTime": {
1517
"bHBTime": 0,
1618
"nDBMonth": 3,
1719
"nTimeCheck": 3,
1820
"nTCPTimeOut": 5,
19-
"nHttpTimeOut": 5
21+
"nHttpTimeOut": 5,
22+
"nWSTimeOut": 5
2023
},
2124
"XLog": {
2225
"MaxSize": 1024000,

XEngine_Source/MQCore_ConfigModule/Config_Define.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,15 @@ typedef struct tag_XEngine_ServerConfig
2020
BOOL bDeamon;
2121
int nTCPPort;
2222
int nHttpPort;
23+
int nWSPort;
2324
struct
2425
{
2526
int nMaxClient;
2627
int nMaxQueue;
2728
int nIOThread;
2829
int nTCPThread;
2930
int nHttpThread;
31+
int nWSThread;
3032
}st_XMax;
3133
struct
3234
{
@@ -35,6 +37,7 @@ typedef struct tag_XEngine_ServerConfig
3537
int nTimeCheck;
3638
int nTCPTimeOut;
3739
int nHttpTimeOut;
40+
int nWSTimeOut;
3841
}st_XTime;
3942
struct
4043
{

XEngine_Source/MQCore_ConfigModule/Config_Json/Config_Json.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,9 @@ BOOL CConfig_Json::Config_Json_File(LPCTSTR lpszConfigFile,XENGINE_SERVERCONFIG
6868
pSt_ServerConfig->bDeamon = st_JsonRoot["bDeamon"].asInt();
6969
pSt_ServerConfig->nTCPPort = st_JsonRoot["nTCPPort"].asInt();
7070
pSt_ServerConfig->nHttpPort = st_JsonRoot["nHttpPort"].asInt();
71+
pSt_ServerConfig->nWSPort = st_JsonRoot["nWSPort"].asInt();
7172

72-
if (st_JsonRoot["XMax"].empty() || (5 != st_JsonRoot["XMax"].size()))
73+
if (st_JsonRoot["XMax"].empty() || (6 != st_JsonRoot["XMax"].size()))
7374
{
7475
Config_IsErrorOccur = TRUE;
7576
Config_dwErrorCode = ERROR_MQ_MODULE_CONFIG_JSON_XMAX;
@@ -81,8 +82,9 @@ BOOL CConfig_Json::Config_Json_File(LPCTSTR lpszConfigFile,XENGINE_SERVERCONFIG
8182
pSt_ServerConfig->st_XMax.nIOThread = st_JsonXMax["nIOThread"].asInt();
8283
pSt_ServerConfig->st_XMax.nTCPThread = st_JsonXMax["nTCPThread"].asInt();
8384
pSt_ServerConfig->st_XMax.nHttpThread = st_JsonXMax["nHttpThread"].asInt();
85+
pSt_ServerConfig->st_XMax.nWSThread = st_JsonXMax["nWSThread"].asInt();
8486

85-
if (st_JsonRoot["XTime"].empty() || (5 != st_JsonRoot["XTime"].size()))
87+
if (st_JsonRoot["XTime"].empty() || (6 != st_JsonRoot["XTime"].size()))
8688
{
8789
Config_IsErrorOccur = TRUE;
8890
Config_dwErrorCode = ERROR_MQ_MODULE_CONFIG_JSON_XTIME;
@@ -94,6 +96,7 @@ BOOL CConfig_Json::Config_Json_File(LPCTSTR lpszConfigFile,XENGINE_SERVERCONFIG
9496
pSt_ServerConfig->st_XTime.nTimeCheck = st_JsonXTime["nTimeCheck"].asInt();
9597
pSt_ServerConfig->st_XTime.nTCPTimeOut = st_JsonXTime["nTCPTimeOut"].asInt();
9698
pSt_ServerConfig->st_XTime.nHttpTimeOut = st_JsonXTime["nHttpTimeOut"].asInt();
99+
pSt_ServerConfig->st_XTime.nWSTimeOut = st_JsonXTime["nWSTimeOut"].asInt();
97100

98101
if (st_JsonRoot["XLog"].empty() || (3 != st_JsonRoot["XLog"].size()))
99102
{

XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ BOOL CProtocolModule_Packet::ProtocolModule_Packet_HttpCommon(XENGINE_PROTOCOLHD
126126
Json::Value st_JsonRoot;
127127
Json::Value st_JsonMQProtocol;
128128
Json::Value st_JsonPayload;
129+
Json::StreamWriterBuilder st_JsonBuilder;
129130

130131
st_JsonMQProtocol["tszMQKey"] = pSt_MQProtocol->tszMQKey;
131132
st_JsonMQProtocol["nSerial"] = pSt_MQProtocol->nSerial;
@@ -145,9 +146,10 @@ BOOL CProtocolModule_Packet::ProtocolModule_Packet_HttpCommon(XENGINE_PROTOCOLHD
145146

146147
st_JsonRoot["st_Payload"] = st_JsonPayload;
147148
}
149+
st_JsonBuilder["emitUTF8"] = true;
148150

149-
*pInt_MsgLen = st_JsonRoot.toStyledString().length();
150-
memcpy(ptszMsgBuffer, st_JsonRoot.toStyledString().c_str(), *pInt_MsgLen);
151+
*pInt_MsgLen = Json::writeString(st_JsonBuilder, st_JsonRoot).length();
152+
memcpy(ptszMsgBuffer, Json::writeString(st_JsonBuilder, st_JsonRoot).c_str(), *pInt_MsgLen);
151153

152154
return TRUE;
153155
}

XEngine_Source/XEngine_MQServiceApp/MQService_Hdr.h

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ using namespace std;
2828
#include <XEngine_Include/XEngine_HelpComponents/Packets_Error.h>
2929
#include <XEngine_Include/XEngine_RfcComponents/HttpServer_Define.h>
3030
#include <XEngine_Include/XEngine_RfcComponents/HttpServer_Error.h>
31+
#include <XEngine_Include/XEngine_RfcComponents/WSProtocol_Define.h>
32+
#include <XEngine_Include/XEngine_RfcComponents/WSProtocol_Error.h>
3133
#include "../XQueue_ProtocolHdr.h"
3234
#include "../MQCore_ConfigModule/Config_Define.h"
3335
#include "../MQCore_ConfigModule/Config_Error.h"
@@ -40,16 +42,24 @@ using namespace std;
4042

4143
#define XENGINE_MQAPP_NETTYPE_TCP 1
4244
#define XENGINE_MQAPP_NETTYPE_HTTP 2
45+
#define XENGINE_MQAPP_NETTYPE_WEBSOCKET 3
4346

4447
extern BOOL bIsRun;
4548
extern XLOG xhLog;
4649
extern XNETHANDLE xhTCPSocket;
47-
extern XNETHANDLE xhTCPPacket;
48-
extern XNETHANDLE xhTCPHeart;
4950
extern XNETHANDLE xhHTTPSocket;
51+
extern XNETHANDLE xhWSSocket;
52+
53+
extern XNETHANDLE xhTCPHeart;
54+
extern XNETHANDLE xhWSHeart;
55+
56+
extern XNETHANDLE xhTCPPacket;
5057
extern XHANDLE xhHTTPPacket;
58+
5159
extern XNETHANDLE xhTCPPool;
5260
extern XNETHANDLE xhHttpPool;
61+
extern XNETHANDLE xhWSPool;
62+
5363
extern XENGINE_SERVERCONFIG st_ServiceCfg;
5464

5565
void ServiceApp_Stop(int signo);
@@ -58,6 +68,7 @@ void ServiceApp_Stop(int signo);
5868
#include "MQService_Net.h"
5969
#include "MQService_TCPTask.h"
6070
#include "MQService_HttpTask.h"
71+
#include "MQService_WSTask.h"
6172

6273
#ifdef _WINDOWS
6374
#ifdef _DEBUG
@@ -71,6 +82,7 @@ void ServiceApp_Stop(int signo);
7182
#pragma comment(lib,"x86/XEngine_HelpComponents/HelpComponents_XLog.lib")
7283
#pragma comment(lib,"x86/XEngine_HelpComponents/HelpComponents_Packets.lib")
7384
#pragma comment(lib,"x86/XEngine_RfcComponents/RfcComponents_HttpServer.lib")
85+
#pragma comment(lib,"x86/XEngine_RfcComponents/RfcComponents_WSProtocol.lib")
7486
#else
7587
#ifdef WIN64
7688
#pragma comment(lib,"../x64/Release/MQCore_ConfigModule.lib")
@@ -83,6 +95,7 @@ void ServiceApp_Stop(int signo);
8395
#pragma comment(lib,"x64/XEngine_HelpComponents/HelpComponents_XLog.lib")
8496
#pragma comment(lib,"x64/XEngine_HelpComponents/HelpComponents_Packets.lib")
8597
#pragma comment(lib,"x64/XEngine_RfcComponents/RfcComponents_HttpServer.lib")
98+
#pragma comment(lib,"x64/XEngine_RfcComponents/RfcComponents_WSProtocol.lib")
8699
#else
87100
#pragma comment(lib,"../Release/MQCore_ConfigModule.lib")
88101
#pragma comment(lib,"../Release/MQCore_ProtocolModule.lib")
@@ -94,6 +107,7 @@ void ServiceApp_Stop(int signo);
94107
#pragma comment(lib,"x86/XEngine_HelpComponents/HelpComponents_XLog.lib")
95108
#pragma comment(lib,"x86/XEngine_HelpComponents/HelpComponents_Packets.lib")
96109
#pragma comment(lib,"x86/XEngine_RfcComponents/RfcComponents_HttpServer.lib")
110+
#pragma comment(lib,"x86/XEngine_RfcComponents/RfcComponents_WSProtocol.lib")
97111
#endif
98112
#endif
99113
#pragma comment(lib,"Ws2_32.lib")

XEngine_Source/XEngine_MQServiceApp/MQService_Net.cpp

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,48 @@ void __stdcall MessageQueue_Callback_HttpLeave(LPCTSTR lpszClientAddr, SOCKET hS
4545
XEngine_MQXService_Close(lpszClientAddr, XENGINE_MQAPP_NETTYPE_HTTP, FALSE);
4646
}
4747
//////////////////////////////////////////////////////////////////////////
48+
BOOL __stdcall MessageQueue_Callback_WSLogin(LPCTSTR lpszClientAddr, SOCKET hSocket, LPVOID lParam)
49+
{
50+
SessionModule_Client_Create(lpszClientAddr);
51+
SocketOpt_HeartBeat_InsertAddrEx(xhWSHeart, lpszClientAddr);
52+
RfcComponents_WSPacket_Create(lpszClientAddr, 0);
53+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("Websocket客户端连接,Websocket客户端地址:%s"), lpszClientAddr);
54+
return TRUE;
55+
}
56+
void __stdcall MessageQueue_Callback_WSRecv(LPCTSTR lpszClientAddr, SOCKET hSocket, LPCTSTR lpszRecvMsg, int nMsgLen, LPVOID lParam)
57+
{
58+
BOOL bLogin = FALSE;
59+
RfcComponents_WSPacket_GetLogin(lpszClientAddr, &bLogin);
60+
if (bLogin)
61+
{
62+
if (!RfcComponents_WSPacket_Post(lpszClientAddr, lpszRecvMsg, nMsgLen))
63+
{
64+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("投递Websocket数据包到消息队列失败,错误:%lX"), WSFrame_GetLastError());
65+
return;
66+
}
67+
SocketOpt_HeartBeat_ActiveAddrEx(xhWSHeart, lpszClientAddr);
68+
}
69+
else
70+
{
71+
int nSDLen = nMsgLen;
72+
TCHAR tszHandsBuffer[1024];
73+
memset(tszHandsBuffer, '\0', sizeof(tszHandsBuffer));
74+
75+
RfcComponents_WSConnector_HandShake(lpszRecvMsg, &nSDLen, tszHandsBuffer);
76+
RfcComponents_WSPacket_SetLogin(lpszClientAddr);
77+
NetCore_TCPXCore_SendEx(xhWSSocket, lpszClientAddr, tszHandsBuffer, nSDLen);
78+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("WEBSOCKET客户端:%s 与服务器握手成功"), lpszClientAddr);
79+
}
80+
}
81+
void __stdcall MessageQueue_Callback_WSLeave(LPCTSTR lpszClientAddr, SOCKET hSocket, LPVOID lParam)
82+
{
83+
XEngine_MQXService_Close(lpszClientAddr, XENGINE_MQAPP_NETTYPE_WEBSOCKET, FALSE);
84+
}
85+
void __stdcall MessageQueue_Callback_WSHeart(LPCSTR lpszClientAddr, SOCKET hSocket, int nStatus, LPVOID lParam)
86+
{
87+
XEngine_MQXService_Close(lpszClientAddr, XENGINE_MQAPP_NETTYPE_WEBSOCKET, TRUE);
88+
}
89+
//////////////////////////////////////////////////////////////////////////
4890
void XEngine_MQXService_Close(LPCTSTR lpszClientAddr, int nIPProto, BOOL bHeart)
4991
{
5092
if (XENGINE_MQAPP_NETTYPE_TCP == nIPProto)
@@ -62,6 +104,21 @@ void XEngine_MQXService_Close(LPCTSTR lpszClientAddr, int nIPProto, BOOL bHeart)
62104
}
63105
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("TCP客户端离开,TCP客户端地址:%s"), lpszClientAddr);
64106
}
107+
else if (XENGINE_MQAPP_NETTYPE_WEBSOCKET == nIPProto)
108+
{
109+
RfcComponents_WSPacket_Delete(lpszClientAddr);
110+
SessionModule_Client_Delete(lpszClientAddr);
111+
112+
if (bHeart)
113+
{
114+
NetCore_TCPXCore_CloseForClientEx(xhWSSocket, lpszClientAddr);
115+
}
116+
else
117+
{
118+
SocketOpt_HeartBeat_DeleteAddrEx(xhWSHeart, lpszClientAddr);
119+
}
120+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("Websocket客户端离开,Websocket客户端地址:%s"), lpszClientAddr);
121+
}
65122
else
66123
{
67124
RfcComponents_HttpServer_CloseClinetEx(xhHTTPPacket, lpszClientAddr);
@@ -100,5 +157,18 @@ BOOL XEngine_MQXService_Send(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int
100157
return FALSE;
101158
}
102159
}
160+
else if (XENGINE_MQAPP_NETTYPE_WEBSOCKET == nIPProto)
161+
{
162+
TCHAR tszPKTBuffer[8196];
163+
memset(tszPKTBuffer, '\0', sizeof(tszPKTBuffer));
164+
165+
RfcComponents_WSCodec_EncodeMsg(lpszMsgBuffer, tszPKTBuffer, &nMsgLen, ENUM_XENGINE_RFCOMPONENTS_WEBSOCKET_OPCODE_TEXT);
166+
if (!NetCore_TCPXCore_SendEx(xhWSSocket, lpszClientAddr, tszPKTBuffer, nMsgLen))
167+
{
168+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("发送数据给Websocket客户端:%s,失败,错误:%lX"), lpszClientAddr, NetCore_GetLastError());
169+
return FALSE;
170+
}
171+
SocketOpt_HeartBeat_ActiveAddrEx(xhWSHeart, lpszClientAddr);
172+
}
103173
return TRUE;
104174
}

0 commit comments

Comments
 (0)