《计算机网络课程设计双机通信“聊天热线”的制作设计.doc》由会员分享,可在线阅读,更多相关《计算机网络课程设计双机通信“聊天热线”的制作设计.doc(13页珍藏版)》请在三一办公上搜索。
1、目录1需求分析 21.1开发环境21.2功能要求213功能实现 22总体设计 32.1软件的运行环境设计 32.2客户端设计 32.3服务器端设计 43详细设计与系统实现 43.1客户端的实现 43.2服务器端的实现 84软件测试与性能分析 114.1软件测试 114.2性能分析 125设计总结126参考文献13“聊天热线”的制作 -网络通信软件设计报告1. 需求分析1.1 开发背景随着数据通信技术的发展特别是计算机技术的发展,网络已成为信息传播的重要渠道,在很多C/S软件中,都提供了在线交流的功能,类似QQ、UC、网络聊天室一类的聊天系统的发展日新月异。因此,制作了一个网络“聊天热线”,通过
2、制作该软件更好的学习网络编程原理和实现技术。1.2 功能要求客户端需要完成的功能:(1)通过IP地址和端口号请求与服务器连接。(2)可以向服务器发送消息。(3)如果服务器端断开,在列表中给出响应提示。(4)可以清空和保存历史聊天记录。(5)可以查看版本信息。(6)文件传输。服务器端需要完成的功能:(1)打开本地端口,并对其进行监控。(2)当接收到连接请求时打开与客户端的连接,并将连接的信息显示在列表中。(3)当接收到客户端发来的消息时将其显示在列表中。(4)可以回复客户端。(5)可以清空和保存历史聊天记录。(6)可以查看版本信息。(7)当接收到客户端关闭请求时,断开与客户端的连接。(8)文件传
3、输。1.3 功能实现考虑到通信软件制作的复杂性和课程设计的时间问题,设计的“聊天热线”主要实现了以下功能:客户端实现的功能:(1)通过IP地址和端口号与服务器连接验证成功。(2)向服务器发送消息验证功能。(3)服务器端断开,在列表中给出响应提示。(4)清空和保存历史聊天记录验证功能。(5)查看版本信息。服务器端实现的功能:(1)打开并监控本地端口。(2)与客户端连接的信息显示在列表中验证功能。(3)客户端发来的消息显示在列表中验证功能。(4)回复客户端。(5)清空和保存历史聊天记录。(6)查看版本信息。(7)接受到客户端关闭请求,断开与客户端的连接。2总体设计设计思想:为实现网络聊天的功能,采
4、用Windows Socket编程。在设计聊天方案时,客户端通过IP地址和端口号与服务器端连接,服务器端监听到连接请求,进行响应;建立连接之后客户端将信息发往服务器端,再由服务器端进行分别处理。客户端和服务器端都实现清空和保存历史聊天记录。“聊天热线”制作的总体设计包括:l 软件的运行环境设计l 客户端设计l 服务器端设计2.1 软件的运行环境设计为了保证系统运行的效率和可靠性,一般情况下,服务器端应具有较高的软硬件配置,客户端的要求不需要很高。此应用程序虽适用于Internet和内部局域网,但只是为了进一步学习网络编程知识,应用不够广泛,所以对软硬件配置不是太高。1. 软件环境l 客户端:W
5、indows 98,Microsoft Visual C+ 6.0以上版本l 服务器端:Windows 98/2000,Microsoft Visual C+ 6.0以上版本2. 硬件环境l 客户机:CPU要求200MMX以上,内存64MB以上l 服务器端:CPU要求200MMX以上,内存64MB以上2.2 客户端设计根据需求分析和功能要求,对客户端各个功能进行集中、分块,本软件客户端的功能模块图如图1所示。客户端通过IP地址和端口号请求与服务器连接客户端列表显示向服务器发送的消息清空和保存历史聊天记录服务器端断开, 客户端列表给出响应提示查看版本信息图1 客户端功能模块图2.3 服务器端设计
6、根据需求分析和功能要求,对服务器端各个功能进行集中、分块,本软件服务器端的功能模块图如图2所示。服务器端服务器端列表显示与客户端连接的信息服务器端列表显示客户端发来的消息清空和保存历史聊天记录服务器端回复客户端消息查看版本信息客户端关闭 ,服务器端列表显示断开信息打开本地端口并对其进行监控图2 服务器端功能模块图3. 详细设计与系统实现3.1 客户端的实现建立一个基于Dialogbased的MFC AppWizard项目,其中使用静态文本控件、按扭控件、IP地址控件、编辑控件、组控件、和列表控件等各种常用控件,以及通过Socket进行网络通信编程。1. 从CAsyncSocket派生出类CCl
7、ientSocket,其头文件如下:class CClientSocket : public CAsyncSocket/ Attributespublic:/ Operationspublic:CClientSocket();virtual CClientSocket();/ Overridespublic:/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CClientSocket)public:virtual void OnConnect(int nErrorCode);virtual void OnReceive
8、(int nErrorCode);virtual void OnClose(int nErrorCode);/AFX_VIRTUAL/ Generated message map functions/AFX_MSG(CClientSocket)/ NOTE - the ClassWizard will add and remove member functions here./AFX_MSG/ Implementationprotected:;2. 类CClientSocket中重写三个成员函数:OnConnect、OnReceive、OnClose,代码如下:void CClientSock
9、et:OnConnect(int nErrorCode) / TODO: Add your specialized code here and/or call the base classif(nErrorCode)AfxMessageBox(连接出现错误,请您重新连接!);return;AsyncSelect(FD_READ|FD_WRITE|FD_CLOSE);(CChatClientDlg*)(AfxGetApp()-m_pMainWnd)-ServerIP.EnableWindow(FALSE);(CChatClientDlg*)(AfxGetApp()-m_pMainWnd)-m_B
10、uttonConnect.EnableWindow(FALSE);(CChatClientDlg*)(AfxGetApp()-m_pMainWnd)-m_ButtonSend.EnableWindow();(CChatClientDlg*)(AfxGetApp()-m_pMainWnd)-m_ListWords.AddString(连接上服务器端);(CChatClientDlg*)(AfxGetApp()-m_pMainWnd)-m_ListWords.SetTopIndex(CChatClientDlg*)(AfxGetApp()-m_pMainWnd)-m_ListWords.GetCo
11、unt()-1);CAsyncSocket:OnConnect(nErrorCode);void CClientSocket:OnReceive(int nErrorCode) / TODO: Add your specialized code here and/or call the base classchar szTemp250;int n=Receive(szTemp,250);szTempn=0;CString sTemp;sTemp.Format(收到:%s,szTemp);(CChatClientDlg*)(AfxGetApp()-m_pMainWnd)-m_ListWords.
12、AddString(sTemp);(CChatClientDlg*)(AfxGetApp()-m_pMainWnd)-m_ListWords.SetTopIndex(CChatClientDlg*)(AfxGetApp()-m_pMainWnd)-m_ListWords.GetCount()-1);CAsyncSocket:OnReceive(nErrorCode);void CClientSocket:OnClose(int nErrorCode) / TODO: Add your specialized code here and/or call the base class(CChatC
13、lientDlg*)(AfxGetApp()-m_pMainWnd)-m_ListWords.AddString(服务器端已经断开);(CChatClientDlg*)(AfxGetApp()-m_pMainWnd)-m_ListWords.SetTopIndex(CChatClientDlg*)(AfxGetApp()-m_pMainWnd)-m_ListWords.GetCount()-1);(CChatClientDlg*)(AfxGetApp()-m_pMainWnd)-ServerIP.EnableWindow();(CChatClientDlg*)(AfxGetApp()-m_pM
14、ainWnd)-m_ButtonConnect.EnableWindow();(CChatClientDlg*)(AfxGetApp()-m_pMainWnd)-m_ButtonSend.EnableWindow(FALSE);Close();CAsyncSocket:OnClose(nErrorCode);3. 类CChatClientDlg中添加5个事件处理函数,代码如下:void CChatClientDlg:OnButtonConnect() / TODO: Add your control notification handler code hereBYTE nFild4;Updat
15、eData(true);ServerIP.GetAddress(nFild0,nFild1,nFild2,nFild3);CString sIP;sIP.Format(%d.%d.%d.%d,nFild0,nFild1,nFild2,nFild3);m_ClientSocket.Create();m_ClientSocket.Connect(sIP,14875);void CChatClientDlg:OnButtonSend() / TODO: Add your control notification handler code hereUpdateData();m_ClientSocket
16、.Send(m_sWords,m_sWords.GetLength();m_ListWords.AddString(发送:+m_sWords);m_ListWords.SetTopIndex(m_ListWords.GetCount()-1); m_sWords=;UpdateData(false);void CChatClientDlg:OnButtonClear() / TODO: Add your control notification handler code herem_ListWords.ResetContent();void CChatClientDlg:OnButtonSav
17、e() / TODO: Add your control notification handler code herechar szFilters=文本文件(*.txt)|*.txt|;CFileDialog FileDlg(FALSE,txt,ChatHistory.txt,OFN_HIDEREADONLY,szFilters,this);if(FileDlg.DoModal()=IDOK)CString sPathName=FileDlg.GetPathName();CFile HistoryFile;if(HistoryFile.Open(sPathName,CFile:modeCrea
18、te|CFile:modeWrite)char szTemp250;int n;for(int i=0;im_pMainWnd)-m_ServerSocket);/启用发送按扭(CChatServerDlg*)(AfxGetApp()-m_pMainWnd)-m_ButtonSend.EnableWindow();(CChatServerDlg*)(AfxGetApp()-m_pMainWnd)-m_ServerSocket.AsyncSelect(FD_READ|FD_WRITE|FD_CLOSE);(CChatServerDlg*)(AfxGetApp()-m_pMainWnd)-m_Li
19、stWords.AddString(接受客户端连接请求);(CChatServerDlg*)(AfxGetApp()-m_pMainWnd)-m_ListWords.SetTopIndex(CChatServerDlg*)(AfxGetApp()-m_pMainWnd)-m_ListWords.GetCount()-1);CAsyncSocket:OnAccept(nErrorCode); void CServerSocket:OnReceive(int nErrorCode) / TODO: Add your specialized code here and/or call the bas
20、e classchar szTemp250;int n=Receive(szTemp,250);szTempn=0;CString sTemp;sTemp.Format(收到:%s,szTemp);(CChatServerDlg*)(AfxGetApp()-m_pMainWnd)-m_ListWords.AddString(sTemp);(CChatServerDlg*)(AfxGetApp()-m_pMainWnd)-m_ListWords.SetTopIndex(CChatServerDlg*)(AfxGetApp()-m_pMainWnd)-m_ListWords.GetCount()-
21、1);CAsyncSocket:OnReceive(nErrorCode);void CServerSocket:OnClose(int nErrorCode) / TODO: Add your specialized code here and/or call the base class(CChatServerDlg*)(AfxGetApp()-m_pMainWnd)-m_ListWords.AddString(客户端已经断开);(CChatServerDlg*)(AfxGetApp()-m_pMainWnd)-m_ListWords.SetTopIndex(CChatServerDlg*
22、)(AfxGetApp()-m_pMainWnd)-m_ListWords.GetCount()-1);(CChatServerDlg*)(AfxGetApp()-m_pMainWnd)-m_ButtonSend.EnableWindow(FALSE);Close();CAsyncSocket:OnClose(nErrorCode);3. 类CChatServerDlg中添加4个事件处理函数,代码如下:void CChatServerDlg:OnButtonSend() / TODO: Add your control notification handler code hereUpdateD
23、ata();m_ServerSocket.Send(m_sWords,m_sWords.GetLength();m_ListWords.AddString(发送:+m_sWords);m_ListWords.SetTopIndex(m_ListWords.GetCount()-1);m_sWords=;UpdateData(false);void CChatServerDlg:OnButtonClear() / TODO: Add your control notification handler code herem_ListWords.ResetContent();void CChatSe
24、rverDlg:OnButtonSave() / TODO: Add your control notification handler code herechar szFilters=文本文件(*.txt)|*.txt|;CFileDialog FileDlg(FALSE,txt,ChatHistory.txt,OFN_HIDEREADONLY,szFilters,this);if(FileDlg.DoModal()=IDOK)CString sPathName=FileDlg.GetPathName();CFile HistoryFile;if(HistoryFile.Open(sPath
25、Name,CFile:modeCreate|CFile:modeWrite)char szTemp250;int n;for(int i=0;im_ListWords.GetCount();i+)n=m_ListWords.GetTextLen(i);m_ListWords.GetText(i,szTemp);szTempn=r;szTempn+1=n;HistoryFile.Write(szTemp,n+2);HistoryFile.Close();elseAfxMessageBox(无法打开文件:+sPathName);void CChatServerDlg:OnButtonAbout()
26、 / TODO: Add your control notification handler code hereCAboutDlg dlgAbout;dlgAbout.DoModal();4.在CChatServerDlg类的OnInitDialog()成员函数中添加如下代码:m_ServerSocket.Create(14875); /创建监听Socket,端口号为14875m_ServerSocket.Listen(1); /开始监听,只接受一个客户端程序运行结果如图4所示:图4 聊天热线服务器端4. 软件测试与性能分析4.1 软件测试本软件采取的测试方式是先进行模块测试,经过修改和调整通
27、过之后,进行总体测试,测试结果各项功能均已经或基本达到设计要求。如图5所示。采用的测试环境是:客户端和服务器端都采用Windows XP操作系统 + Microsoft Visual C+ 6.0。测试的主要内容包括:客户端通过IP地址和端口号请求与服务器端连接、连接信息在列表中显示、客户端发送消息和服务器端回复消息显示在列表中、清空和保存历史聊天记录、查看版本信息、客户端或服务器端任一方断开则在列表中给出提示。图54.2 性能分析主要问题及故障现象的分析:客户端向服务器端发送连接请求时,总是弹出图6窗口。当点击“忽略”按扭时,客户端可以连接上服务器端;若点击“终止”或者“重试”按扭时,则自动
28、将服务器端窗口关闭。一直不得其解。图65. 设计总结1. 程序的应改进之处l 使用注册、登录功能。l 实现多对多聊天。l 实现文件传输。l 使用非模态对话框代替模态对话框。l 设计漂亮、多元化的界面2. 个人小结由于之前没有接触过网络编程,这次课程设计是在边学习边实践的基础上完成的,做的结果不太好,和自己原来的设想有很大差距。虽然课程设计时间有限,但是我会在以后的时间里继续学习、实践,争取做出一个好的“聊天热线”。短短的两个星期,却让我学到了很多关于Socket网络编程的知识,同时,进一步掌握了软件设计的步骤和过程,最重要的是抓住了整个软件设计的灵魂软件工程思想。6. 参考文献1 龙马工作室. Visual C+ 6.0程序设计学与用教程. 北京:机械工业出版社,2003.4.2 赛奎春等. Visual C+工程应用与项目实践. 北京:机械工业出版社,2005.1.3 谢希仁. 计算机网络(第四版). 北京:电子工业出版社,2003.6.4 张海藩. 软件工程. 北京:人民邮电出版社,2002.3.