CFrameworkLinster
CFrameworkLinster是CSocketListener的派生类,主要负责维护一个sever中service的列表、处理接收的数据以及发送数据
CFrameworkService
CFrameworkService是一个抽象类,实现service对象时需要继承CFrameworkService,并实现serviceRunning方法:
1 2 3 4 5 6 7 8 9 10 11 12
| class CFrameworkService { private: string mServiceName; public: CFrameworkService(string name) { mServiceName = name; } virtual ~CFrameworkService() { }
string getServiceName() { return mServiceName; }
virtual int serviceRunning(std::shared_ptr<CSocketClient> client_socket, CJson *json_data) = 0; };
|
service的注册、获取与注销
注册比较简单,添加到列表中即可:
1 2 3 4 5 6
| void CFrameworkListener::registerService(std::shared_ptr<CFrameworkService> service) { mServiceMutex.lock(); mFrameServiceLists.push_back(service); mServiceMutex.unlock(); }
|
获取时根据名字,在列表中查找对应的service:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| std::shared_ptr<CFrameworkService> CFrameworkListener::getFrameworkService(string service_name) { list<std::shared_ptr<CFrameworkService>>::iterator it;
mServiceMutex.lock(); for (it = mFrameServiceLists.begin(); it != mFrameServiceLists.end(); it++) { if ((*it)->getServiceName() == service_name) { mServiceMutex.unlock(); return (*it); } } mServiceMutex.unlock();
return nullptr; }
|
注销时清空列表:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| void CFrameworkListener::releaseAllFrameworkService() { list<std::shared_ptr<CFrameworkService>>::iterator it;
mServiceMutex.lock(); for (it = mFrameServiceLists.begin(); it != mFrameServiceLists.end(); it++) { (*it) = nullptr; it = mFrameServiceLists.erase(it); continue; } mServiceMutex.unlock();
return; }
|
处理接收的数据
接收到数据后,根据数据中的service_name,选择对应service,执行它的serviceRunnin方法完成对应的操作
由于我这里传输数据使用json字符串,所以接收到数据后需要将其序列化json对象,定义client传输数据的数据结构如下:
1 2 3 4 5
| { "operate":"set", "sdk_test_set_name":"test", "service_name":"test_service" }
|
client发送的数据意义如下:
- operate有get和set两种
- service_name代表这个操作是发给那个service
- sdk_test_set_name是用户自定义的此次操作的key,test是value。
这条数据代表:发给test_service,设置test_name为test
根据实际情况,value可以为空
数据处理的实现如下:
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
| bool CFrameworkListener::onDataAvailable(std::shared_ptr<CSocketClient> client_socket) { char *package = nullptr; int length = -1;
for(;;) { if(client_socket->recvData(&package, &length) == 0) { if (package != nullptr && length > 0) { dispatchService(this, client_socket, package, length); } else { return true; } } else { return false; } } }
void CFrameworkListener::dispatchService(CFrameworkListener *listener, std::shared_ptr<CSocketClient> client_socket, string data, int data_length) { CJson *json = nullptr; string service_name, service_operate; std::shared_ptr<CFrameworkService> framework_service;
if (listener == nullptr || client_socket == nullptr) { return; }
printf("dispatchService data[%d]: %s\n",data_length, data.c_str());
json = new CJson(data);
if (json == nullptr) { return; }
if ((json->getValueByKey("service_name", service_name)) != 0 && json->getValueByKey("operate", service_operate)) { delete json; return; }
framework_service = listener->getFrameworkService(service_name);
if (framework_service != nullptr) { if (framework_service->serviceRunning(client_socket, json) != 0) { } } else { string response_data; CJson *response = new CJson(); response->insertKeyValue("service_name", service_name); response->insertKeyValue("operate", service_operate);
response_data = response->getJsonToString(); client_socket->sendData((char *)response_data.c_str(), response_data.length() + 1); }
}
|