典型网络数据库系统软件设计
2010-02-19 20:34:02 来源:WEB开发网3、通信协议设计
验证。客户端发送LOGIN消息,服务器回应 LOGINResponse消息;
通信。客户端发送CHATTING 或 NOTICE 消息,服务器端根据接收到的消息,发送CHATTING,NOTICE或 USERList 消息。
4、服务器设计
<1>、建立工程
①、用MFC AppWizard(exe) 新建一个“单个文档”的工程;
②、在Step 2 of 6中,选 “查看数据库不使用文件支持”,点击“Data Source..”按钮,然后在弹出的对话框中选 “DAO”类型,再浏览选择数据库文件Data.mdb. 按确定,再在弹出的窗口选User表;
③、点击Next到Step 4 of 6,选“windows Sockets”。网络功能支持;
④、按“NEXT“,最后点击 “完成”;
<2>、在CSuperServerView中添加下列成员:int m_iPort;//服务器端口
<3>、CSuperServerView类的关键成员函数:
CSocketListen * m_pSocket; //监听套接字。
CSocketClient m_SocketClient[Max]; //跟客户端通信的套接字。
CArchive * m_pArOut; //发送消息时的序列化文档对象指针。
CArchive * m_pArIn; //接收消息时的序列化化文档对象指针。
CSocketFile * m_pSF; //套接字文件对象指针。
CMsg msg;//消息类对象
CString Decode(int n,CString strMsg); //消息的解码函数
void SendUserList();
bool CheckLogin(CSocketClient *pClient);
void MyReceive(CSocketClient *pClient);
void MyClose(CSocketClient *pClient);
void MyAccept();
void CSuperServerView::MyReceive(CSocketClient *pClient)
{
m_pSF=new CSocketFile(pClient);
m_pArIn=new CArchive(m_pSF,CArchive::load);
msg.Serialize (*m_pArIn);
int i;
bool bOK=false;
switch(msg.m_eType )
{
case LOGIN: //处理用户登录。
{
m_pSF=new CSocketFile(pClient);
m_pArOut=new CArchive(m_pSF,CArchive::store);
msg.m_eType =LOGINResponse;
if(CheckLogin(pClient))
{
if(!pClient->m_bBoss)
{
msg.m_strMsg="GOOD|欢迎!";
bOK=true;
}
else
{
msg.m_strMsg="GOOD|BOSS";
bOK=true;
}
else
{
msg.m_strMsg="FAILED|验证失败!";
}
msg.Serialize (*m_pArOut);
m_pArOut->Flush ();
if(bOK) SendUserList();
break;
}
case CHATTING: //处理普通消息
{
for(i=0;i<Max;i++)
{
if(m_SocketClient[i].m_bBusy)
{
if(m_SocketClient[i].m_strName ==Decode(1,msg.m_strMsg))
{
m_pSF=new CSocketFile(&m_SocketClient[i]);
m_pArOut=new CArchive(m_pSF,CArchive::store);
msg.m_strMsg=pClient->m_strName+"|"+Decode(2,msg.m_strMsg);
msg.Serialize (*m_pArOut);
m_pArOut->Flush ();
break;
}
}
}
break;
}
case NOTICE: //处理广播消息。
{
msg.m_strMsg=pClient->m_strName+"|"+Decode(2,msg.m_strMsg);
for(i=0;i<Max;i++)
{
if(m_SocketClient[i].m_bBusy &&
m_SocketClient[i].m_strName != pClient->m_strName)
{
m_pSF=new CSocketFile(&m_SocketClient[i]);
m_pArOut=new CArchive(m_pSF,CArchive::store);
msg.Serialize (*m_pArOut);
m_pArOut->Flush ();
}
}
break;
}
}
}
void CSuperServerView::MyAccept()
{
for(int i=0;i<Max;i++)
{
if(!m_SocketClient[i].m_bBusy)
{
m_pSocket->Accept (m_SocketClient[i]);
m_SocketClient[i].GetView (this);
break;
}
}
}
void CSuperServerView::OnStartServer() //开始服务
{
m_pSocket=new CSocketListen(this);
m_pSocket->Create (m_iPort,SOCK_STREAM);
m_pSocket->Listen ();
m_staState.SetWindowText("正在监听......");
}
void CSuperServerView::OnStopServer() //关闭服务
{
if(m_pSocket) m_pSocket->Close ();
for(int i=0;i<Max;i++)
{
if(m_SocketClient[i].m_bBusy)
{
m_SocketClient[i].Close();
m_SocketClient[i].m_bBusy=false;
}
}
m_staState.SetWindowText("服务关闭");
}
更多精彩
赞助商链接