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++) { if ((*it)->getServiceName() == service_name) { (*it)->processData(json_data); break; } } mClientMutex.unlock();
delete json_data; }
|
其他
- 发送数据直接调用CSocket中的sendData()方法即可
- 在列表中注册和注销client就是list操作
以上两点在此不过多赘述了