您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 网络聊天程序的设计和实现报告
程序设计实践设计报告课题名称:网络聊天程序的设计和实现学生姓名:班级:班内序号:17学号:日期:2014.5.251)课题概述1.1课题目标和主要内容主要内容和目标:(1)按实验步骤使用VC++设计出程序,在此的基础上用VC++或其他工具设计出一个能实现两个人及以上人次聊天的网络程序。(2)熟悉VisualC++的基本操作;掌握最基本的Client/Server(客户机/服务器)模式的网络编程技术,并在此基础上实现更为复杂的网络编程;基本了解基于对话框的windows应用程序的编写过程;对于WindowsSocket编程建立初步概念。使用的开发平台:VC2013采用的主要工具:MFC应用程序1.2系统的主要功能功能表:1.建立服务器:程序运行后,可以输入IP地址和端口号后建立服务器,用于监听信息。2.实现客户端功能:程序运行后,可以输入IP地址和端口号,连入服务器,进入聊天室聊天。3.聊天功能:进入聊天室的客户可以给自己取昵称,然后进行多人聊天。界面可以输入聊天内容、昵称,可以显示聊天信息。2)系统设计2.1系统总体框架系统框架图:系统在输入IP和端口之后,可以建立服务器。再打开一个程序作为客户端,输入IP和端口,连接进入服务器聊天室可以进行多人聊天。2.2系统详细设计2.2.1模块划分图及描述a)服务器监听模块:添加一个基于CSocket的CserverSocket类,用于监听套接字。其中CSocket是CAsyncSocket类的派生类,它们都是从CObject类继承下来的。CSocket类是更高层次的网络接口抽象。在服务器端,需要先用指定端口创建套接字,然后调用Listen()函数对制定连接端口进行监听,再创建一个空的CSocket对象。收到请求后,调用Accept()函数对客户端的连接请求进行接收。具体过程中,需要先添加成员变量和初始化函数声明。然后需要重载OnAccept函数。b)通信类模块该部分主要用于创建客户端程序以及数据的传输,其实现方式原理如下:i.客户端程序:首先调用系统的Create()函数,用缺省的端口创建套接字;然后需要使用函数Connect()连接指定地址的服务器。ii.数据传输:该部分主要实现信息的传输、接受和处理。首先创建与CSocket类的对象相连接的CSocketFile类对象,再创建与CSocketFile类的对象相连接的CArchive类对象,用于储存将要发送的数据,再创建与CSocketFile类的对象相连接的CArchive类对象,用于存储接收数据,最后只需要发送和接收数据。具体实现方式为:1.添加用于发送、接收和存储的成员变量以及初始化函数声明。2.添加用于发送消息的SendMessage()函数,添加关闭套接字的函数CloseSocket()。3.添加函数staticintGetIpAddress()函数获取本地IP地址。4.重载函数OnClose(),OnReceive(),分别用于服务器处理关闭套接字以及接收数据。c)信息模块:为项目添加基于CObject类的CMessg类,主要用于保存数据。核心包括定义CString类型的变量m_strText,另外需要修改构造函数和Serialize函数。d)窗口界面模块:首先创建一个基于对话框的项目,再设计对话框:添加一个ListBox控件显示所有聊天内容,并为其关联Clistbox类型的成员变量;添加一个EditBox控件输入发送聊天信息,并为其关联CString类型成员变量;添加一个IP控件输入服务器地址,并为其关联IP控件类型成员变量;添加一个EditBox类型控件输入服务器端口,并为其关联UNIT类型的成员变量;添加一个EditBox类型控件输入用户昵称,并为其关联一个CString类型成员变量;对吼添加三个按钮分别表示“发送消息”、“建立服务”和“连接服务器”,设置好各自的ID。在对窗口的处理中,需要实现以下几点:1.为对话框类中添加实现处理连接和处理断开连接的函数ProcessAccert()和CloseSessionSocket().2.实现对相关变量的初始化;3.对三个按钮建立相关的消息函数,包括建立服务,连接和发送消息。2.2.2类关系图及描述本程序CAboutDlg类并没有太大变化,主要对其他类进行分析:CClientSocket类成员表:名称属性说明CClientSocket::~CClientSocket成员函数析构函数CClientSocket::CClientSocket成员函数构造函数CClientSocket::CloseSocket成员函数关闭套接字CClientSocket::GetIpAddress成员函数获取本地IPCClientSocket::Init成员函数初始化CClientSocket::OnClose成员函数关闭连接CClientSocket::OnReceive成员函数接受数据CClientSocket::SendMessage成员函数发送数据CClientSocket::m_aSessionIn成员变量数据输入CClientSocket::m_aSessionOut成员变量数据接收CClientSocket::m_bClose成员变量关闭连接的BOOL型变量CClientSocket::m_bInit成员变量初始化变量CClientSocket::m_dlg对象指针用于进行操作的指针CClientSocket::m_sfSocketFile指针用于储存的指针Cmessg类成员表:名称属性说明CMessg::~CMessg成员函数析构函数CMessg::CMessg成员函数构造函数CMessg::Serialize成员函数控制数据输入和输出CMessg::from成员变量用户昵称,显示数据来源CMessg::m_strText成员变量输入聊天内容CMessg::to成员变量用户昵称,显示数据对象CServerSocket类成员表:名称属性说明CServerSocket::~CServerSocket成员函数析构函数CServerSocket::CServerSocket成员函数构造函数CServerSocket::Init成员函数服务器初始化CServerSocket::OnAccept成员函数重载后用于接收连接CServerSocket::m_dlg对象指针实现操作CServerSocket::m_uPort成员变量端口号CSimpleChatDlg类成员表:名称属性说明CSimpleChatDlg::CloseSessionSocket成员函数处理断开连接CSimpleChatDlg::CSimpleChatDlg成员函数构造函数CSimpleChatDlg::OnBnClickedConnect成员函数点击后连接服务器CSimpleChatDlg::OnBnClickedSendMessage成员函数点击后发送数据CSimpleChatDlg::OnBnClickedSetServer成员函数点击后建立服务器CSimpleChatDlg::OnInitDialog成员函数初始化对话框CSimpleChatDlg::ProcessPendingAccept成员函数处理连接CSimpleChatDlg::m_bClient成员变量BOOL类型记录连接CSimpleChatDlg::m_bInit成员变量BOOL类型记录是否初始化CSimpleChatDlg::m_clientsocket对象名套接字对象CSimpleChatDlg::m_connectionList成员变量连接者清单CSimpleChatDlg::m_name成员变量显示连接着昵称CSimpleChatDlg::m_pListenSocket成员变量服务器套接字CSimpleChatDlg::m_srvIP成员变量记录输入的IP地址CSimpleChatDlg::m_srvMessage成员变量显示聊天内容的控件变量CSimpleChatDlg::m_strMessage成员变量输入信息的控件变量2.2.3程序流程图及描述整个聊天室工作状态如上图。2.3关键算法分析函数一:Init(UINTport,CSimpleChatDlg*dlg)//初始化服务器函数BOOLCServerSocket::Init(UINTport,CSimpleChatDlg*dlg){m_uPort=port;m_dlg=dlg;if(Create(m_uPort)==FALSE){AfxMessageBox(_T(服务器创建错误!));returnFALSE;}if(this-Listen()==FALSE){AfxMessageBox(_T(服务器监听失败!));returnFALSE;}m_dlg-m_srvMessage.AddString(_T(服务器建立成功!));returnTRUE;}函数二:OnClose(intnErrorCode)//关闭连接voidCClientSocket::OnClose(intnErrorCode){//TODO:在此添加专用代码和/或调用基类m_bClose=true;CloseSocket();m_dlg-CloseSessionSocket();CSocket::OnClose(nErrorCode);}函数三:CloseSocket()//关闭套接字voidCClientSocket::CloseSocket(){if(m_aSessionIn){deletem_aSessionIn;m_aSessionIn=NULL;}if(m_aSessionOut){deletem_aSessionOut;m_aSessionOut=NULL;}if(m_sfSocketFile){deletem_aSessionOut;m_sfSocketFile=NULL;}Close();m_bInit=false;m_bClose=true;}函数四:OnReceive(intnErrorCode)//接收数据voidCClientSocket::OnReceive(intnErrorCode){//TODO:在此添加专用代码和/或调用基类do{CMessgtemp;temp.Serialize(*m_aSessionIn);m_dlg-m_srvMessage.InsertString(0,temp.from+_T(说:)+temp.m_strText);//m_dlg-m_namelist.InsertString(0,temp.from);if(!m_dlg-m_bClient)//服务器{for(POSITIONpos=m_dlg-m_connectionList.GetHeadPosition();pos!=NULL;){CClientSocket*t=(CClientSocket*)m_dlg-m_connectionList.GetNext(pos);if(t-m_hSocket!=this-m_hSocket)t-SendMessage(&temp);}}}while(!m_aSessionIn-IsBufferEmpty());m_dlg-UpdateData(false);CSocket::OnReceive(nErrorCode);}函数五:GetIpAddress(constCString&sHostName,BYTE&f0,BYTE&f1,BYTE&f2,BYTE&f3)//获取本地IPintCClientSocket::GetIpAddress(constCString&sHostName,BYTE&f0,BYTE&f1,BYTE&f2,BYTE&f3){structhostentFAR*lpHostEnt=gethostbyname((char*)&sHostName);if(lpHostEnt==NULL)//错误{f0=f1=f
本文标题:网络聊天程序的设计和实现报告
链接地址:https://www.777doc.com/doc-3562235 .html