详细功能分析报告.docx
《详细功能分析报告.docx》由会员分享,可在线阅读,更多相关《详细功能分析报告.docx(17页珍藏版)》请在冰点文库上搜索。
详细功能分析报告
一、软件简介
本软件主要完成简单的多客户端实时通信,基于TCP协议的局域网聊天软件。
首先启动服务器,服务器启动后等待客户端的请求,同时显示出离线用户列表。
客户端通过输入账号和密码进行登录,如果登录成功,则进入聊天界面,同时显示当前在线好友列表和离线好友列表,如果登录失败,则提示用户账号或者密码错误。
当多个客户端进入聊天室后,客户之间可以进行群聊,用户同时可以选择与当前在线的某一好友进行私聊。
二、需求分析
2.1、任务概述
随着信息化时代的快速发展,互联网的应用越来越广泛,同时实时聊天通信技术变得日益重要,不论在学校、家庭或者是公司,局域网聊天已经离不开我们的日常生活。
本软件所设计的局域网聊天系统能够实现局域网的聊天、群聊、私聊等功能。
2.2、需求规定
该软件可以完成多客户端的通信,服务器端包括:
服务器启动,离线用户列表和在线用户列表,同时还要完成客户端登录信息的验证,当有用户登录成功时,服务器端实时刷新在先用户列表。
客户端包括:
用户登录,当用户登录成功后,进入聊天界面,用户之间可以进行群聊和私聊。
2.3、对性能的规定
2.3.1、时间特性要求
所有发送操作的响应的时间一般不超过1秒,大量的信息发送后,应该在5秒内显示,如果未发送失败,会提示出相关的错误信息。
当存在离线用户上线时,用户在线列表更新时间在3秒内响应。
2.3.2、运行环境规定
该软件只能在windows环境平台下运行,内存在256M以上,硬盘1G空余空间。
三、总体设计
3.1、软件总体功能结构图
图(3.1)软件总体功能结构图
如图(3.1)所示为该软件总体功能结构图,其中主要包括两大部分:
服务器端和客户端。
其中服务器端主要包括:
连接数据库、用户列表更新、客户端信息处理。
客户端包括:
客户端登录、在线用户列表、离线用户列表、用户群聊、用户私聊。
3.2、软件工作流程图
图(3.2)软件工作流程图
如图(3.2)所示,为整个软件工作的流程图,首先开启服务器,服务器等待客户端的请求连接,然后客户端发送连接请求(发送账号和密码),然后等待服务器的回应,服务器收到连接请求后,验证客户信息,如果信息验证成功,则连接建立成功,好友之间通过服务器端向客户端发送好友信息。
3.3、服务器总体设计
服务器端主要功能:
(1)数据库设计:
设计数据库,用户存储客户信息,例如用户的账号、密码、昵称等。
(2)客户端请求信息处理:
主要用来处理用户登录验证,如果验证成功,则给客户端回复登录成功信息。
(3)客户端信息转发:
主要完成客户之间通信时,首先客户发送信息给服务器,服务器端然后在转发给其他的客户。
(4)用户列表更新:
主要用来处理当有新客户端登录成功后,对现在用户列表和离线用户列表进行更新。
3.4、客户端总体设计
客户端主要功能:
(1)客户端登录:
主要完成客户端的登录,客户端输入用户名和密码,然后进行登录,如果登录成功,则跳转到聊天模块,如果登录失败,则提醒用户名或者密码错误。
(2)连接服务器:
通过当前输入的账号和密码,连接服务器开启的端口号。
(3)实时通信模块:
主要完成在线用户之间进行群聊和私聊。
(4)用户列表更新:
主要显示当前在线好友列表和离线好友列表。
四、详细设计
4.1、软件详细的功能流程图
图(4.1)软件详细功能流程图
4.2、数据库设计
该系统采用的是微软的Access数据库,用来存放用户信息,数据字典如下表所示:
表
(一)用户信息
字段
名称
备注
账号
昵称
StrName
密码
strPass
真实姓名
strRealName
性别
strSex
本系统将数据库操作封装为一个类,方便开发人员的操作,相关的函数介绍如下所示:
打开数据库函数:
voidOpenDataBase();
关闭数据库函数:
voidCloseDataBase();
打开记录集:
_RecordsetPtr&OpenRecordset(CStringsql);
关闭记录集:
voidCloseRecordset();
4.3、程序中定义的核心数据结构
1、定义消息头的数据结构
typedefstructtagHeader
{
chartype;
intlen;
}Header,*pHeader;
以上结构体主要包含两个部分内容,type为char型字符,用来存储用户发送的是什么类型的消息,type定义的取值如下所示:
#defineLOGIN_IO1//用户登录消息
#defineSEND_MESSAGE3//用户发送消息
#definePRIVATE_MESSAGE4//用户私聊消息
#definePASS_SUCCESS5//用户密码验证成功消息
#definePASS_FAILED6//用户密码验证失败消息
#defineSERVER_STOP7//服务器停止消息
#defineASK_NUM8//应答消息
#defineASKNUM_FAILED9//应答失败消息
#definePRIVATE_ASK10//私聊应答消息
#definePRIVATE_REFUSE11//私聊拒绝消息
以上为该软件定义的头消息结构的类型,主要包括:
用户登录消息、用户发送消息、用户私聊消息、用户密码验证成功消息、用户密码验证失败消息、服务器停止消息、应答消息、应答失败消息、私聊应答消息、私聊拒绝消息。
用户通过发送不同的消息类型给服务器,服务器收到消息类型后进行判断,依据不同的消息类型进行不同的处理。
2、定义用户登录信息数据结构
typedefstructLogonUser
{
CStringname;
CStringpassword;
}User,*pUser;
以上结构体主要包含两部分:
用户名和密码。
当用户登录时,客户端将用户发送给服务器端,服务器端接收到后,对用户名和密码进行验证。
4.4、客户端详细设计
1、用户登录模块
(1)用户登录模块流程图
图(4.2)用户登录模块流程图
(2)程序描述
对在用户登录信息界面中输入的各项信息进行初步检验。
若发现错误,提示用户输入错误,让用户重新输入一次。
若未发现错误,转入主界面。
其中的错误种类有:
输入数据不匹配、账号(数据库没有该账号)、密码(与对应账号的密码不匹配)。
在登录界面中,主要的函数为:
判断是否为空:
IdentifyNull(name,password,server);
创建套接字:
CreateSocket(server);
发送账号:
SendName(name);
发送密码:
SendPssword(password);
其中发送账号和密码的函数为:
//发送用户名
voidCDlgLogin:
:
SendName(CStringname)
{
//设置发送类型
head.type=LOGIN_IO;
//发送长度
head.len=name.GetLength();
//发送登陆LOGIN_IO命令字
m_pSocket->Send((char*)&head,sizeof(Header));
//发送账号
m_pSocket->Send(name,name.GetLength());
}
//发送密码
voidCDlgLogin:
:
SendPssword(CStringpassword)
{
head.type=PASS_SUCCESS;
head.len=password.GetLength();
//发送验证密码PASS_SUCCESS命令字
m_pSocket->Send((char*)&head,sizeof(Header));
m_pSocket->Send(password,password.GetLength());
}
2、群聊模块
(1)群聊模块流程图
图(4.3)群聊模块流程图
(2)程序描述
群聊主要完成多客户端之间的通信,主要的函数及其功能如下:
更新用户列表:
UpdateUser()
接收消息:
GetSendMessage()
发送消息:
OnButtonSend()
其中发送消息的详细程序代码如下:
voidCChatClientDlg:
:
OnButtonSend()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
//得到发送的消息内容
CStringmessaegeContent;
m_sendMessage.GetWindowText(messaegeContent);
//判断发送的消息是否为空消息
if(messaegeContent=="")
{
AfxMessageBox("不能发送空消息!
");
//设置鼠标的焦点
CEdit*pEdit=(CEdit*)GetDlgItem(IDC_EDIT_SENDINFO);
pEdit->SetFocus();
return;
}
//发送消息的结构体
Headerhead;
//发送消息的命令字
head.type=SEND_MESSAGE;
//发送消息的长度
head.len=messaegeContent.GetLength();
//当前时间
CTimetime=CTime:
:
GetCurrentTime();
//时间格式
CStringt=time.Format("%H:
%M:
%S");
//昵称
CStringnikeName=theApp.m_strName;
CStringstr=nikeName+""+t+"\r\n"+""+messaegeContent;
//发送命令字
m_pSocket->Send((char*)&head,sizeof(Header));
//发送消息
if(m_pSocket->Send((LPCTSTR)str,str.GetLength()))
{
//清空消息框
m_sendMessage.SetWindowText("");
CEdit*pEdit=(CEdit*)GetDlgItem(IDC_EDIT_CHATINFO);
pEdit->SetFocus();
}
else
{
AfxMessageBox("网络传输错误!
");
}
}
3、私聊模块
(1)私聊模块流程图
图(4.4)私聊模块流程图
(2)程序描述
私聊模块主要实现点对点之间的通信,相关的函数如下所示:
发送消息:
OnButtonSend()
获取消息:
GetMessage(CStringstrPrivtMsg)
其中发送消息的详细代码如下所示:
voidCPrivateDlg:
:
OnButtonSend()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CStringsendMsg;
m_sendMessage.GetWindowText(sendMsg);
if(sendMsg=="")
{
AfxMessageBox("不能发送空消息!
");
CEdit*pEdit=(CEdit*)GetDlgItem(IDC_EDIT_SEND);
pEdit->SetFocus();
return;
}
Headerhead;
if(theApp.PrivateOrLeave)
{
head.type=LEAVE_MESSAGE;
head.len=sendMsg.GetLength();
CTimetime=CTime:
:
GetCurrentTime();
CStringt=time.Format("%H:
%M:
%S");
CStringstr1=theApp.m_strName+""+t+"\r\n"+""+sendMsg+"\r\n";
CStringstr=theApp.m_strLeaveDesName+'&'+theApp.m_strName+'&'+theApp.m_strName+t+"\r\n"+""+sendMsg+"\r\n"+'&';
//目的主机名+本地主机名+时间+回车换行+消息
m_pSocket->Send((char*)&head,sizeof(Header));
//发送离线消息命令字LEAVE_MESSAGE,发送用户名+时间+消息内容
if(m_pSocket->Send((LPCTSTR)str,str.GetLength()))
{
//清空发送文本框
m_sendMessage.SetWindowText("");
//在接收文本框显示出来
m_receiveMessage.ReplaceSel(str1);
//在控件显示消息
UpdateData(FALSE);
CEdit*pEdit=(CEdit*)GetDlgItem(IDC_EDIT_SEND);
pEdit->SetFocus();
}
else
{
AfxMessageBox("网络传输错误!
");
}
}
…….
}
4.5、服务器端详细设计
1、启动服务器,等待客户连接
//创建socket对象
CServerSocket*m_pSocket;
m_pSocket=newCServerSocket;
if(!
m_pSocket->Create(9999))
{
AfxMessageBox("创建Socket失败!
");
returnFALSE;
}
if(!
m_pSocket->Listen())
{
AfxMessageBox("创建侦听发生错误!
");
returnFALSE;
}
2、用户列表更新
(1)用户列表更新流程图
图(4.5)用户列表更新流程图
(2)程序描述
在线用户列表和离线用户列表实时更新:
UpdateUser(CServerClientSocket*pSocket,CStringm_usrLeaveName,inttype)
离线用户列表显示:
ListCloseUser()
3、其他函数介绍
验证用户信息:
IdentifyUser(CStringname,CStringpassword)
通过账号得到用户名:
GetNameByNum(CStringnum)
通过账号得到密码:
GetPassByNun(CStringnum)
五、实现和运行结果
1、服务器端
图(5.1)服务器监听图(5.2)客户登录成功,服务器显示信息
2、客户端
图(5.3)客户端登录界面
图(5.4)群聊模块
图(5.5)私聊请求模块
图(5.6)私聊模块