CFrameworkLinster

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)
{
/*error*/
}
}
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);
}

}

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