我现在做[u]一个服务器用C++做的,客户端用Android做的通讯程序。服务器使用的 NDK 2.0开发包。
有一堆采集设备向服务器发送数据。服务器接收到数据后向移动设备转发。考虑到移动设备端处理能力和流量控制。服务器在向移动设备端发送数据时需要做过滤。移动设备端一时只显示一台采集设备的数据,其他采集设备的数据是没必要下发到移动设备端的。
我在NDKUser类中增加了一个char数组用来保存移动设备端的识别号。当移动设备端切换显示采集设备时,发送设备识别号到服务器设置当前查看的是哪一台采集设备。服务器下发数据时根据这个设备识别号匹配是否需要下发到移动设备端。
NDKUser.h部分代码
//用户序号
long m_lId;
//数据识别号
char m_simNO[12];
//设置数据接收范围
void SetDataMatch(char lpBuf[]);
//设置是否进行数据过滤
void SetDataMatchState(BOOL isFilter);
//判断是否符合数据接收条件
BOOL CompArray(char arr2[]);
NDKUser.cpp部分代码
//设置接收数据范围
void CNDKUser::SetDataMatch(char lpBuf[])
{
dataLock.Lock();
while(!m_userDataQueue->empty())
{
m_userDataQueue->pop();
}
strcpy(m_simNO, lpBuf);//调试,设置之后再重新切换采集设备识别号时发现上次设置的值没有了
SetDataFilter(true);
dataLock.Unlock();
}
//设置是否进行数据过滤
void CNDKUser::SetDataMatchState(BOOL isFilter)
{
m_bFilter = isFilter;
}
//判断数组是否相同
BOOL CNDKUser::CompArray(char arr2[])
{
BOOL bResult = true;
dataLock.Lock();
for(int i=0;i<strlen(arr2);i++)
{
bResult = m_simNO[i]==arr2[i];//不管设置了什么识别号这里的m_simNO值始终是空的
if(!bResult)
break;
}
dataLock.Unlock();
return bResult;
}
NDKUserManager.h部分代码
////////////////////////////////////////////////////////////////////////////////
// Defines //
////////////////////////////////////////////////////////////////////////////////
typedef CArray<long, long> CLongArray;
typedef CList<CNDKUser, CNDKUser &> CUserList;
typedef CList<long, long> CLongList;
NDKUserManager.cpp部分代码
// Adds a user then returns its new Id.
long CNDKUserManager::AddUser(CNDKServerSocket* pServerSocket)
{
m_lNextId++;
CNDKUser* user =new CNDKUser(m_lNextId, pServerSocket);
user->m_hwnd = m_hwnd;
if(m_bThreadSendData)
user->CreateThreadSendData();
m_users.AddTail(*user);
return m_lNextId;
}
//设置接收数据范围
void CNDKUserManager::SetDataMatch(long lUserId,char lpBuf[])
{
CNDKUser& user = GetUserFromId(lUserId);
if (user.GetId() > 0)
{
user.SetDataMatch(lpBuf);
}
}
////////////////////////////////////////////////////////////////////////////////
// Private Operations //
////////////////////////////////////////////////////////////////////////////////
// Gets a user from an Id.
CNDKUser CNDKUserManager::GetUserFromId(long lUserId) const
{
CNDKUser user;
POSITION pos = m_users.GetHeadPosition();
while (pos != NULL)
{
user = m_users.GetNext(pos);
if (user.GetId() == lUserId)
pos = NULL;
}
return user;
}
// Sends a message to all users. 下发数据到移动设备端
BOOL CNDKUserManager::SendMessageToAllUsers(CLongList& listIds, const void* lpBuf, int nBufLen,char simNO[12], int nFlags)
{
POSITION pos = m_users.GetHeadPosition();
while (pos != NULL)
{
CNDKUser& user = m_users.GetNext(pos);
if(user.m_bFilter && user.CompArray(simNO)) //判断是否需要过虑数据,是否符合接收条件(采集设备识别号是否匹配)
{
if(m_bThreadSendData)
{
SENDDATA data;
data->data = lpBuf;
data->dataLen = nBufLen;
user.AddDataToQueue(data);
}
else
{
int i =0 ;
while(!user.SendMessage(lpBuf, nBufLen, nFlags) && i<3) //3次发送失败
{
i++;
}
if(i==3)
listIds.AddTail(user.GetId()); //记录发送失败连接号
}