网络聊天程序的设计和实现报告.docx_第1页
网络聊天程序的设计和实现报告.docx_第2页
网络聊天程序的设计和实现报告.docx_第3页
网络聊天程序的设计和实现报告.docx_第4页
网络聊天程序的设计和实现报告.docx_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

程序设计实践设计报告课题名称: 网络聊天程序的设计和实现 学生姓名: 班 级: 班内序号: 1 7 学 号: 日 期: 2014.5.25 1) 课题概述1.1课题目标和主要内容 主要内容和目标:(1)按实验步骤使用VC+设计出程序,在此的基础上用VC+或其他工具设计出一个能实现两个人及以上人次聊天的网络程序。 (2)熟悉VisualC+的基本操作;掌握最基本的Client/Server(客户机/服务器)模式的网络编程技术,并在此基础上实现更为复杂的网络编程;基本了解基于对话框的windows应用程序的编写过程;对于Windows Socket编程建立初步概念。使用的开发平台: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.添加函数static int GetIpAddress()函数获取本地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(UINT port, CSimpleChatDlg* dlg)/初始化服务器函数BOOL CServerSocket:Init(UINT port, CSimpleChatDlg* dlg)m_uPort=port;m_dlg=dlg;if(Create(m_uPort)=FALSE)AfxMessageBox(_T(服务器创建错误!);return FALSE;if(this-Listen()=FALSE)AfxMessageBox(_T(服务器监听失败!);return FALSE;m_dlg-m_srvMessage.AddString(_T(服务器建立成功!);return TRUE;函数二:OnClose(int nErrorCode)/关闭连接void CClientSocket:OnClose(int nErrorCode)/ TODO: 在此添加专用代码和/或调用基类m_bClose=true;CloseSocket();m_dlg-CloseSessionSocket();CSocket:OnClose(nErrorCode);函数三:CloseSocket()/关闭套接字void CClientSocket:CloseSocket()if(m_aSessionIn)delete m_aSessionIn;m_aSessionIn=NULL;if(m_aSessionOut)delete m_aSessionOut;m_aSessionOut=NULL;if(m_sfSocketFile)delete m_aSessionOut;m_sfSocketFile=NULL;Close();m_bInit=false;m_bClose=true;函数四:OnReceive(int nErrorCode)/接收数据void CClientSocket:OnReceive(int nErrorCode)/ TODO: 在此添加专用代码和/或调用基类doCMessg temp;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(POSITION pos=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(const CString &sHostName,BYTE &f0,BYTE &f1,BYTE &f2,BYTE &f3)/获取本地IPint CClientSocket:GetIpAddress(const CString &sHostName,BYTE &f0,BYTE &f1,BYTE &f2,BYTE &f3)struct hostent FAR * lpHostEnt=gethostbyname(char*)&sHostName);if(lpHostEnt=NULL) /错误f0=f1=f2=f3=0;return GetLastError();LPSTR lpAddr=lpHostEnt-h_addr_list0;if(lpAddr) /获取IPstruct in_addr inAddr;memmove(&inAddr,lpAddr,4);f0=inAddr.S_un.S_un_b.s_b1;f1=inAddr.S_un.S_un_b.s_b2;f2=inAddr.S_un.S_un_b.s_b3;f3=inAddr.S_un.S_un_b.s_b4;return 0;函数六:OnBnClickedConnect()/连接服务器void CSimpleChatDlg:OnBnClickedConnect()/ TODO: 在此添加控件通知处理程序代码if(!m_bInit)BYTE f0,f1,f2,f3;m_srvIP.GetAddress(f0,f1,f2,f3);CString ip;ip.Format(_T(%d.%d.%d.%d),f0,f1,f2,f3);m_bClient=true;m_clientsocket.Create();if(m_clientsocket.Connect(ip,GetDlgItemInt(IDC_PORT)m_clientsocket.Init(this);m_srvMessage.AddString(_T(连接成功!);/m_namelist.InsertString(0, m_name);m_bInit=true;elsem_clientsocket.Close();AfxMessageBox(_T(连接失败!);/m_namelist.InsertString(0, m_name);m_bInit=false;函数七:OnBnClickedSendMessage()/点击发送消息void CSimpleChatDlg:OnBnClickedSendMessage()/ TODO: 在此添加控件通知处理程序代码UpdateData();if(!m_bInit)AfxMessageBox(_T(没有连接到服务器!);return;CMessg msg;msg.m_strText=m_strMessage;msg.from = m_name;CString out;if(!m_bClient)out = msg.from;out += 说:;out += msg.m_strText;m_srvMessage.InsertString(0, out);/m_namelist.InsertString(0, msg.from);POSITION pos;for(pos=m_connectionList.GetHeadPosition();pos!=NULL;)CClientSocket * t= (CClientSocket *)m_connectionList.GetNext(pos);t-SendMessage(&msg);elseout = msg.from;out += 说:;out += msg.m_strText;m_srvMessage.InsertString(0, out);/m_namelist.InsertString(0, msg.from);m_clientsocket.SendMessage(&msg);m_strMessage=_T();UpdateData(false);函数八:OnBnClickedSetServer()/建立服务器void CSimpleChatDlg:OnBnClickedSetServer()/ TODO: 在此添加控件通知处理程序代码if(!m_bInit)m_bClient=false;m_bInit=true;if(m_pListenSocket.Init(GetDlgItemInt(IDC_PORT),this)=FALSE)m_bInit=false;return;函数九:ProcessPendingAccept()/处理链接void CSimpleChatDlg:ProcessPendingAccept()CClientSocket* pSocket = new CClientSocket();if (m_pListenSocket.Accept(*pSocket)CMessg msg;msg.m_strText=_T(一个游客进入聊天室了);m_srvMessage.InsertString(0, _T(一个游客进入聊天室了);POSITION pos;for(pos=m_connectionList.GetHeadPosition();pos!=NULL;)CClientSocket * t= (

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论