北邮程序设计实践-聊天程序_第1页
北邮程序设计实践-聊天程序_第2页
北邮程序设计实践-聊天程序_第3页
北邮程序设计实践-聊天程序_第4页
北邮程序设计实践-聊天程序_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

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

文档简介

1、程序设计实践设计报告课题名称:_聊天程序_学生姓名:_徐东玲_班 级:_2014211108_学 号:_2014210227_班内序号:_26_日 期:_2016/06/07_1 课题概述1.1课题目标和主要内容聊天程序虽然形态各异,但就其本质,却是相同的。这种程序一般由两大部分组成:服务器端聊天程序和客户端聊天程序。服务器端聊天程序负责接收来自客户端的聊天信息,并且根据客户端的要求把这些信息转发到另外一个活多个客户中。客户端聊天程序则负责建立与维护与服务器端的连接,向服务器发送客户的聊天内容,同时从服务器接收对方的响应。1.2系统的主要功能(1)可以手动输入服务器IP地址和端口号进行连接(客

2、户端功能)。(2)可以手动建立服务器接受其他客户端的连接要求(服务端功能)。(3)可以发送消息给服务端,显示服务端传来消息(客户端功能)。(4)可以接收客户端发送的消息,并将消息传给所有在线的客户端(服务端功能)。(5)可以自动回复(客户端)。2. 系统设计2.1 系统总体框架2.2 系统详细设计服务端:1 模块划分图及描述(1)在特定的端口上等待来自聊天客户的连接请求,并且需要维护一个客户连接表,以记录所有成功的连接。(2)及时接收各个聊天客户发送过来的信息,然后把这些信息转发到一个或多个客户连接。(3)监控这些连接的状态,在客户主动离开或发生故障时从列表中删除相应的表项,并及时更新连接表。

3、2 类关系图及描述CServerSocket类的主要功能是实现OnAccept()消息,负责监听服务端口,是一个服务Socket。此类头文件代码如下:/ CServerSocket command targetclass CChatDlg;class CServerSocket : public CSocket/ Attributespublic:CChatDlg * m_dlg;UINT m_uPort;BOOL Init(UINT port, CChatDlg* dlg);/ Operationspublic:CServerSocket();virtual CServerSocket();

4、/ Overridespublic:/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CServerSocket)/使用类向导添加的public:virtual void OnAccept(int nErrorCode);/AFX_VIRTUAL/ Generated message map functions/AFX_MSG(CServerSocket)/ Implementationprotected:;/AFX_INSERT_LOCATION/ Microsoft Visual C+ will additiona

5、l declarations immediately before the previous line.#endif/ !defined(AFX_SERVERSOCKET_H_03952A19_3B2C_45BD_B9BB_FBBD072ED603_INCLUDED_)3 存储结构、内存分配此模块用到了列表的存储结构客户端:1 模块划分图及描述(1)建立和维护与服务器的连接,并且随时监测连接的状态。(2)把用户输入的信息及时发送到服务端,同时,随时准备好接收服务端的信息,并将它显示出来。(3)在用户退出聊天过程时要关闭与服务端的连接。2 类关系图及描述CClientSocket类通过相应的On

6、Receive消息来接受数据,响应OnClose消息来断开对话的处理。CClientSocket类实现了以CArchive对数据进行的串行化。本类的头文件源代码如下:#include PackMessg.htargetclass CChatDlg;class CClientSocket : public CSocket/ Attributespublic:CArchive* m_aSessionIn;CArchive* m_aSessionOut;CSocketFile* m_sfSocketFile;CChatDlg * m_dlg;bool m_bInit; /作为套接字是否被初始化的标记

7、bool m_bClose; /作为套接字是否被关闭的标记/ Operationspublic:void Init(CChatDlg * dlg);BOOL SendMessage(CPackMessg * msg);void CloseSocket();public:static int GetLocalHostName(CString &sHostName);static int GetIpAddress(const CString &sHostName, BYTE &f0,BYTE &f1,BYTE &f2,BYTE &f3);/获得本地IPstatic CString ErrorRea

8、son(int tag);public:CClientSocket();virtual CClientSocket();/ Overridespublic:/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CClientSocket)/通过classwizard添加到类中的成员函数public:virtual void OnReceive(int nErrorCode);virtual void OnClose(int nErrorCode);/AFX_VIRTUAL/ Generated message map fu

9、nctions/AFX_MSG(CClientSocket)/ Implementationprotected:;previous line.#endif/ !defined(AFX_CLIENTSOCKET_H_9A3B7A03_0D59_4A60_ABA2_35D6CA850937_INCLUDED_)2.3 关键算法分析算法1:CServerSocket:Init1 算法功能初始化服务端2 算法基本思想服务端建立套接字,并且进入监听状态。3 算法空间、时间复杂度分析O(1)4 代码逻辑(可用伪代码描述)BOOL CServerSocket:Init(UINT port, CChatDlg

10、* dlg)m_uPort=port;m_dlg=dlg;if(Create(m_uPort)=FALSE)if(this-Listen()=FALSE)m_dlg-SetDlgItemText(IDC_SHOWMESSAGE,服务器创建成功!);return TRUE; AfxMessageBox(服务器监听错误!); return FALSE; AfxMessageBox(服务器套接字创建失败!); return FALSE;算法2:CClientSocket:OnReceive1 算法功能接收数据2 算法基本思想如果为客户端,将此响应传递到所有与此连接的客户端,如果为客户端,接收响应。3

11、 算法空间、时间复杂度分析O(n)、O(1)4 代码逻辑(可用伪代码描述)void CClientSocket:OnReceive(int nErrorCode)/ TODO: Add your specialized code here and/or call the base classCSocket:OnReceive(nErrorCode);dowhile (!m_aSessionIn-IsBufferEmpty(); CPackMessg temp; temp.Serialize(*m_aSessionIn);m_dlg-m_sMsgList+=temp.m_strText+rn;

12、m_dlg-SetDlgItemText(IDC_SHOWMESSAGE,m_dlg-m_sMsgList); int linenum=(CEdit (CEdit *)(m_dlg-GetDlgItem(IDC_SHOWMESSAGE)-LineScroll(linenum); if(!m_dlg-m_bClient) for(POSITION CClientSocket*t=if(t-m_hSocket!=this-m_hSocket)t-SendMessage(&temp); (m_dlg-GetDlgItem(IDC_SHOWMESSAGE)-GetLineCount(); pos=m_

13、dlg-m_connectionList.GetHeadPosition();pos!=NULL;) (CClientSocket*)m_dlg-m_connectionList.GetNext(pos);算法3:CClientSocket:SendMessage1 算法功能发送消息2 算法基本思想检查连接情况,若断开,关闭对话,若连接,发送消息。3 算法空间、时间复杂度分析O(1)4 代码逻辑(可用伪代码描述)BOOL CClientSocket:SendMessage(CPackMessg * msg) if (m_aSessionOut != NULL)else /对方关闭了连接 m_b

14、Close=true; CloseSocket(); m_dlg-CloseSessionSocket(); return FALSE; msg-Serialize(*m_aSessionOut); m_aSessionOut-Flush(); return TRUE;算法4:CChatClientDlg:OnPaint()1算法功能添加背景图2算法基本思想更换背景,使对话框更美观。3算法时间、空间复杂度分析O(1)4代码逻辑GetClientRect(&rect);/ 获取客户区 /dc.FillSolidRect(&rect, RGB(0,255,0); / 填充客户区颜色 /CDialo

15、g:OnPaint();CDC dcMem; dcMem.CreateCompatibleDC(&dc); CBitmap bmpBackground; bmpBackground.LoadBitmap(IDB_BITMAP1); /IDB_BITMAP是你自己的图对应的ID BITMAP bitmap; bmpBackground.GetBitmap(&bitmap); CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground);dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitm

16、ap.bmWidth,bitmap.bmHeight,SRCCOPY); dcMem.SelectObject(pbmpOld);CDialog:OnPaint();算法5:CChatClientDlg:OnBnClickedAuto()1算法功能自动回复2算法基本思想若点击“自动回复”按钮,则在收到服务端的消息时会自动回复消息3算法的空间、时间复杂度O(1)4代码逻辑void CChatClientDlg:OnBnClickedAuto() check = !check;if (check)CString temp1 = 我:;CString formatbuff = 自动回复你好,主人不在

17、,稍后回复您!;CString str;str = dlg-m_tm.Format(%X );temp1 = str + temp1;temp1 += formatbuff;(*dlg).m_client-Send(formatbuff, 200, 0);dlg-m_list.AddString(temp1);3. 程序运行结果分析可以接收、发送消息,还可以自动回复以及更新时间,并记录历史消息,总体来看,运行结果达到了预期的效果。4. 总结4.1课题的难点和关键点本课题的关键点在于对Sockets的理解和运用。Sockets是Windows网络编程的规范,Windows Sockets是Win

18、dows下得到广泛应用的、开放的、支持多种协议的网络编程接口。 本课题采用的是客户机/服务器模型,此模型工作时要求有一套为客户机和服务器所共识的惯例来保证服务能够被提供(或被接受)。这一套惯例包含了一套协议。它必须在通讯的两头都被实现。根据不同的实际情况,协议可能是对称的或是非对称的。在对称的协议中,每一方都有可能扮演主从角色;在非对称协议中,一方被不可改变地认为是主机,而另一方则是从机。一个对称协议的例子是Internet中用于终端仿真的TELNET。而非对称协议的例子是Internet中的FTP。无论具体的协议是对称的或是非对称的,当服务被提供时必然存在客户进程和服务进程。一个服务程序通常在一个众所周知的地址监听对服务的请求,也就是说,服务进程一直处于休眠状态,直到一个客户对这个服务的地址提出了连接请求。在这个时刻,服务程序被惊醒并且为客户提供服务对客户的请求做出适当的反应。这一请求/相应的过程可以简单的用图表示。虽然基于连接的服务是设计客户机/服务器应用程序时的标准,但有些服务也是可以通过数据报套接口提供的。4.2 本课题的评价本课题在之前的MFC编程的基础上,加入了对于网络技术应用的结合,让我们更深刻得了解了MFC编程的灵活性和实用性。另外,本次设计的软件只能进行基本的文本通信,确实有很多的遗憾。我觉得还可以改进和添加的功能有:a) 可以把聊天记录用一个独立的窗口

温馨提示

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

评论

0/150

提交评论