CNetworkManager

CNetworkManager

CNetworkManager的作用和CFrameworkLinster是相对的,负责维护一个client列表、发送消息、接收到消息后分发给各个client

在CFrameworkLinster中有一个service列表,在使用此SDK时,client和service是一一对应的

此对象是一个单例,所有client共用一个单例

此对象需要两个参数,IP和端口,如下:

1
2
3
4
5
6
7
8
9
10
CNetworkManager::CNetworkManager(std::string ip, int port)
{
mVersion = DEFAULT_VERSION;
mShouldStop = false;
mServerIPAddress = ip;
mServerPort = port;
mConnectStatus = 0;
mSocketClient = nullptr;
start("CNetworkManager");
}

数据接收

此对象继承了CThread,启动了一个线程用于数据接收,这里使用阻塞模式,一直等待server的消息,实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
void CNetworkManager::run()
{
char *data = nullptr;
int data_length = 0;
do
{
mStateMutex.lock();
if (mShouldStop)
{
mStateMutex.unlock();
break;
}
mSocketClient = new CSocketClient(1, true);
mStateMutex.unlock();

if (mSocketClient->getSocket()->connect((char *)(mServerIPAddress.c_str()), mServerPort))
{

mSocketClient->recvData(&data, &data_length);

if (data != nullptr && data_length > 0)
{
mStateMutex.lock();
mConnectStatus = 1;
mStateMutex.unlock();
if (!verifyVersion(data))
{
deliverData(data, data_length);
}

do
{
mStateMutex.lock();
if (mConnectStatus != 1 || mShouldStop || mSocketClient == nullptr)
{
mStateMutex.unlock();
break;
}
mStateMutex.unlock();

mSocketClient->recvData(&data, &data_length);

if (data_length == 0)
{
continue;
}

deliverData(data, data_length);
} while (1);
}
}

mStateMutex.lock();
if ( mSocketClient != nullptr)
{

if (mConnectStatus != 0)
{
mSocketClient->getSocket()->shutdown();
delete mSocketClient;
mSocketClient = nullptr;
mConnectStatus = 0;
}

}
if (mShouldStop)
{
mStateMutex.unlock();
break;
}
mStateMutex.unlock();
CThread::sleep(100);
} while (1);

}

数据处理

接收到可用数据后,根据数据中的服务名称找到对应的client,调用对应client的processDate()函数进行处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
void CNetworkManager::deliverData(char *data, int length)
{
list <CClient *>::iterator it;
string service_name;
CJson* json_data = new CJson(data);
if (json_data == nullptr)
{
return;
}

printf("deliverData[%d]: %s\n", length, data);
if (json_data->getValueByKey("service_name", service_name) != 0)
{
printf("service not found");
}

mClientMutex.lock();
for (it = mClientLists.begin(); it != mClientLists.end(); it++)
{
/*Found Client*/
if ((*it)->getServiceName() == service_name)
{
/*Processing data*/
(*it)->processData(json_data);
break;
}
}
mClientMutex.unlock();

delete json_data;
}

其他

  • 发送数据直接调用CSocket中的sendData()方法即可
  • 在列表中注册和注销client就是list操作

以上两点在此不过多赘述了


CNetworkManager
https://carl-5535.github.io/2022/11/30/CarlSDK/CNetworkManager/
作者
Carl Chen
发布于
2022年11月30日
许可协议