一个工程是我的毕业论文,帮忙给点意见,,很急,谢谢大家!

时间:2021-06-02 06:31:59
我需要c/s模式进行分布式计算在客户器端进行计算,在服务器端进行处理,在程序运行前服务器查询连接到的客户端,然后开始计算,将数据依次发给每个客户端,然后收集数据,最后计算完成时通知客户端断开,此时客户端自动开始重新登陆服务器,比如间隔5秒。
问题:
1怎么在查询完客户端以后在进行计算?
2怎么将数据依次发给每个客户端?我用的是以下方法void GA::CalculateObjectValueOnline(void)
{
ResultNum=0;
for(int i=0;i<FREQNUM;)
{
for(POSITION pos=m_LSock->m_RWSocks.GetHeadPosition();pos!=NULL;)
{
CRWSocket* pSocket=(CRWSocket*)m_LSock->m_RWSocks.GetNext(pos);
pSocket->msg.flag=SMCAL;
pSocket->msg.m_bOnline=1;
strcpy(pSocket->msg.m_strAction,"计算");
pSocket->msg.Floor=InputFloor;
pSocket->msg.Init(InputFloor);
pSocket->msg.indi.Copy(population[i]);
pSocket->SendMsg();
pSocket->End();
i++;
}
}

}void CRWSocket::SendMsg()
{
if (m_pArchiveOut != NULL)
{     
TRY
{
msg.Serialize(*m_pArchiveOut);
m_pArchiveOut->Flush();//这一句有问题
}
CATCH(CFileException, e)
{
m_pArchiveOut->Abort();
delete m_pArchiveOut;
m_pArchiveOut = NULL;
}
END_CATCH
}
}
void CLSocket::OnAccept(int nErrorCode)
{
CSocket::OnAccept(nErrorCode);
ProcessPendingAccept();
}

void CLSocket::ProcessPendingAccept()
{
CRWSocket* pSocket = new CRWSocket();

if (Accept(*pSocket))
{
pSocket->Init();
m_RWSocks.AddTail(pSocket);
}
else
{
delete pSocket;
AfxMessageBox("Accept() fail");
}

}
void CRWSocket::Init()
{
m_pFile = new CSocketFile(this);
m_pArchiveIn = new CArchive(m_pFile,CArchive::load);
m_pArchiveOut = new CArchive(m_pFile,CArchive::store);


}


不过有问题?

3我怎么才能在收到所有的数据以后再进行下一步操作?
谢谢大家。

10 个解决方案

#1


多谢了

#2


MARK,学习~~~期待解决方案!

#3


ft,有什么问题你说啊……

3我怎么才能在收到所有的数据以后再进行下一步操作?
-----------------------
不知道你下一步是干嘛,

1.服务器发数据给客户端,等待
2.客户端计算,发给服务器,断开
3.服务端收集结果

要注意的是每个客户端并不一定都会返回正确的结果,断开或什么网络问题你考虑

#4


服务器对所收集到的结果进行处理,比如求平均,但是前提是必须收集结果是完整的。先假设收回的数据是正确的,主要是怎么等待数据收集完全在求平均

#5


大侠说话啊!!

#6


首先你在CRWSocket加个 m_bIsDataCollected 标志,然后重载OnReceive ( 在CRWSocket加方法OnReceive), 在OnReceive 读client数据,如果读入了正确数据,把m_bIsDataCollected标志设为TRUE, 然后调CalculateObjectValueOnline, 在CalculateObjectValueOnline里检查每个m_RWSocks的m_bIsDataCollected 是否为TRUE, 如果都是TRUE 则开始计算,否则什么都不作。

#7


谢谢大家的解答,问题2我解决的一部分,但是现在又有了新的状况:我在服务器端循环向客户端发数据时由于客户端不多,所以每个客户端会收到很多组数据,但是每计算一组数据需要很长时间,所以数据来不及处理,我使用了以下方法:
void CGACSocket::OnReceive(int nErrorCode)
{
CSocket::OnReceive(nErrorCode);
ProcessPendingRead();
msg.End();

}
void CGACSocket::ProcessPendingRead()
{
do
{
ReceiveMsg();
Deal();
}
while(!m_pArchiveIn->IsBufferEmpty());

}
void CGACSocket::ReceiveMsg()
{
TRY
{
msg.Serialize(*m_pArchiveIn);
}
CATCH(CFileException, e)
{
m_pArchiveOut->Abort();
}
END_CATCH

if (msg.m_bOnline==0)
{
delete m_pArchiveIn;
m_pArchiveIn = NULL;
delete m_pArchiveOut;
m_pArchiveOut = NULL;
delete m_pFile;
m_pFile = NULL;
}
}
void CGACSocket::Deal()
{
……计算
}
单步调试的时候没问题但是一运行起来,好象客户端来不及处理,可能根本没处理这是怎么回事,怎么解决?我不是每次只从缓冲区读一组数据吗?难道缓冲区被刷新了?

#8


我编过很多网络程序,但我看不懂你的。

#9


为什么,写的很混乱?应该还可以吧,要不大侠给点更好的方法,我很急啊

#10


又解决了一些问题,但是好象服务器端有有问题,我想在服务器的一个线程里发送数据但是根据微软的bug报告,在线程之间只能传递SOCKET结构而不是csocket指针,所以我用了以下方法:
void CLSocket::ProcessPendingAccept()
{
CRWSocket* pSocket = new CRWSocket();

if (Accept(*pSocket))
{
//socket=pSocket->Detach();
socket=pSocket->m_hSocket;
m_RWSocks.AddTail(socket);
}
else
{
delete pSocket;
AfxMessageBox("Accept() fail");
}

}
在线程里:
for(POSITION pos=m_LSock->m_RWSocks.GetHeadPosition();pos!=NULL;)
{
CRWSocket* pSocket=new CRWSocket;
pSocket->Attach((SOCKET)m_LSock->m_RWSocks.GetNext(pos));
pSocket->Init();
                   ………………//同上
                   pSocket->SendMsg();
          }
    }
为什么客户端不触发onreceive()?

#1


多谢了

#2


MARK,学习~~~期待解决方案!

#3


ft,有什么问题你说啊……

3我怎么才能在收到所有的数据以后再进行下一步操作?
-----------------------
不知道你下一步是干嘛,

1.服务器发数据给客户端,等待
2.客户端计算,发给服务器,断开
3.服务端收集结果

要注意的是每个客户端并不一定都会返回正确的结果,断开或什么网络问题你考虑

#4


服务器对所收集到的结果进行处理,比如求平均,但是前提是必须收集结果是完整的。先假设收回的数据是正确的,主要是怎么等待数据收集完全在求平均

#5


大侠说话啊!!

#6


首先你在CRWSocket加个 m_bIsDataCollected 标志,然后重载OnReceive ( 在CRWSocket加方法OnReceive), 在OnReceive 读client数据,如果读入了正确数据,把m_bIsDataCollected标志设为TRUE, 然后调CalculateObjectValueOnline, 在CalculateObjectValueOnline里检查每个m_RWSocks的m_bIsDataCollected 是否为TRUE, 如果都是TRUE 则开始计算,否则什么都不作。

#7


谢谢大家的解答,问题2我解决的一部分,但是现在又有了新的状况:我在服务器端循环向客户端发数据时由于客户端不多,所以每个客户端会收到很多组数据,但是每计算一组数据需要很长时间,所以数据来不及处理,我使用了以下方法:
void CGACSocket::OnReceive(int nErrorCode)
{
CSocket::OnReceive(nErrorCode);
ProcessPendingRead();
msg.End();

}
void CGACSocket::ProcessPendingRead()
{
do
{
ReceiveMsg();
Deal();
}
while(!m_pArchiveIn->IsBufferEmpty());

}
void CGACSocket::ReceiveMsg()
{
TRY
{
msg.Serialize(*m_pArchiveIn);
}
CATCH(CFileException, e)
{
m_pArchiveOut->Abort();
}
END_CATCH

if (msg.m_bOnline==0)
{
delete m_pArchiveIn;
m_pArchiveIn = NULL;
delete m_pArchiveOut;
m_pArchiveOut = NULL;
delete m_pFile;
m_pFile = NULL;
}
}
void CGACSocket::Deal()
{
……计算
}
单步调试的时候没问题但是一运行起来,好象客户端来不及处理,可能根本没处理这是怎么回事,怎么解决?我不是每次只从缓冲区读一组数据吗?难道缓冲区被刷新了?

#8


我编过很多网络程序,但我看不懂你的。

#9


为什么,写的很混乱?应该还可以吧,要不大侠给点更好的方法,我很急啊

#10


又解决了一些问题,但是好象服务器端有有问题,我想在服务器的一个线程里发送数据但是根据微软的bug报告,在线程之间只能传递SOCKET结构而不是csocket指针,所以我用了以下方法:
void CLSocket::ProcessPendingAccept()
{
CRWSocket* pSocket = new CRWSocket();

if (Accept(*pSocket))
{
//socket=pSocket->Detach();
socket=pSocket->m_hSocket;
m_RWSocks.AddTail(socket);
}
else
{
delete pSocket;
AfxMessageBox("Accept() fail");
}

}
在线程里:
for(POSITION pos=m_LSock->m_RWSocks.GetHeadPosition();pos!=NULL;)
{
CRWSocket* pSocket=new CRWSocket;
pSocket->Attach((SOCKET)m_LSock->m_RWSocks.GetNext(pos));
pSocket->Init();
                   ………………//同上
                   pSocket->SendMsg();
          }
    }
为什么客户端不触发onreceive()?