MFC聊天软件课程设计报告书_第1页
MFC聊天软件课程设计报告书_第2页
MFC聊天软件课程设计报告书_第3页
MFC聊天软件课程设计报告书_第4页
MFC聊天软件课程设计报告书_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

1、 . . . 面向对象程序设计课程设计设计说明书网络聊天程序设计起止日期:2012年5月27日至2012年6月1日学生 何根班级计本103班学号成绩指导教师(签字)计算机与通信学院2012年 5 月30 日17 / 18网络聊天程序设计一、 课题的介绍和课题的任务课题介绍:近年来随着PC的广泛应用和网络的不断发展,目前网络技术已经成为了计算机领域的最热门的发展方向。聊天室。在网络早期就开始盛行,不论是BBS,IRC 都有类似网上聊天室的机制。聊天室适用于网上会议或闲聊的一些场合。聊天室为网友提供了较好的交友环境,网友之间相互以文字交谈,在形式上有点类似笔友的性质,却大大节省了书信往返

2、的时间,这也是网上交友之所以如此热门的原因。课题任务:1、综合运用本课程与计算机网络的相关知识设计并实现一个网络应用程序,以Visual C+6.0作为开发平台,通过实践复习巩固课堂所学的理论知识,提高对所学知识的综合应用能力,进一步加强winsock编程技术。2、采用客户/服务器模式,分为客户端程序和服务器程序。服务器采用WINSOCK I/O模型中的任一种,支持多个客户同时在线聊天。客户端程序和服务器程序通过网络交换聊天字符串容,服务器窗口的列表框中显示当前在线用户,支持服务器与客户端之间的私聊二、设计的要求1、 用WINSOCK实现简单的网络聊天;2、 在MFC开发平台上编写一个聊天系统

3、; 3、 得server和client之间可以相互通信; 4、 多人能够发送信息至服务器,首先显示进入聊天室的成员名,然后显示对方名字和聊天信息,可以并发执行。5、 服务器与单个客户端之间可以进行私聊三、系统的分析和系统中类的设计在此主要介绍服务器端的构建(即本人所负责的部分),不是本人负责的部分不过多介绍建立连接过程流程图如下:程序个模块代码如下:1.客户端 (1)通过AppWizard生成基于对话框的应用程序ChatClient,在向导的第二步选择WindowsSockets的支持,其余步骤均用默认值。 (2)增加一个登录服务器的对话框资源,其ID为IDD_SETUP,然后通过ClassW

4、izard生成对应的基于CDialog的类CSetupDlg。 (3)给对话框CSetupDlg增加3个编辑框,用来输入登录信息(聊天代号、服务器地址以与服务器端口号), (4)通过ClassWizard生成对应的基于CSocket的类CChatSocket。 (5)给CChatSocket类声明一个主对话框CChatClientDlg指针类型的私有成员变量,其代码如下: protected: CChatClientDlg* m_pDlg;并且在ChatSocket类的头文件开始处增加如下代码:class CChatClientDlg; /主对话框类 (6)给ChatSocket类重载一个构造

5、函数,其定义如下: CChatSocket:CChatSocket(CChatClientDlg* pDlg) m_pDlg = pDlg;并且在ChatSocket类的CPP文件开始处增加如下语句:#include "ChatClientDlg.h" (7)通过ClassWizard响应类的ChatSocket的OnReceive函数,表示可以接收数据了,其代码如下:/通知客户端可以接受数据void CChatSocket:OnReceive(int nErrorCode) CSocket:OnReceive(nErrorCode); if(m_pDlg) PlaySou

6、nd("F:msg.wav",NULL,SND_ASYNC|SND_NODEFAULT); m_pDlg->ProcessPendingRead(); (8)在主对话框ChatClientDlg的头文件中定义ChatSocket指针类型的私有成员变量,其代码如下:CChatSocket* m_pSocket;并且在CChatClientDlg类的头文件开始处增加如下代码:class CChatSocket;/基于CSocket的新类CChatSocket (9)给对话框CChatClientDlg增加处理接收数据的共有成员函数ProcessPendingRead,其定

7、义如下:void CChatClientDlg:ProcessPendingRead()/处理接收的数据 /定义缓冲区 char bufferBUFFER_SIZE; /接收数据 int nReceived = m_pSocket->Receive(buffer,BUFFER_SIZE,0); buffernReceived = 0; /将数据在列表框中显示出来 CString str; str.Format("%s",buffer); m_ctrlMsgs.AddString(str); (10)给对话框CChatClientDlg增加发送数据的私有成员函数Send

8、Msg:/发送数据到服务器void CChatClientDlg:SendMsg(CString strMsg) CString str; str.Format("%s:%s",m_strClientName,strMsg); m_pSocket->Send(str.GetBuffer(0),str.GetLength(),0);并且在CChatClientDlg类的头文件开始处定义缓冲区的大小,其代码如下:#defineBUFFER_SIZE200 (11)给对话框CChatClientDlg增加表示聊天代号的CString类型私有成员变量m_strClientNa

9、me。 (12)在对话框CChatClientDlg的OnInitialUpdate函数中增加登录服务器的代码:BOOL CChatClientDlg:OnInitDialog()/登录服务器 CDialog:OnInitDialog(); ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) CString strAboutMenu; strAboutMe

10、nu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty() pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX, strAboutMenu); SetIcon(m_hIcon, TRUE);/ Set big icon SetIcon(m_hIcon, FALSE);/ Set small icon /显示登录对话框CSetupDlg dlg; if(dlg.DoModal()=IDOK) /创建一个新的Socket m_

11、pSocket = new CChatSocket(this); if (!m_pSocket->Create() delete m_pSocket; m_pSocket = NULL; AfxMessageBox("create socket failed"); return FALSE; /连接服务器 while (!m_pSocket->Connect(dlg.m_strServer,dlg.m_nPort + 700) if (AfxMessageBox("Failed to connect to servernTry again?"

12、,MB_YESNO) = IDNO) delete m_pSocket; m_pSocket = NULL; return FALSE; m_strClientName = dlg.m_strName; else return FALSE; /发送登录消息给服务器 SendMsg("进入聊天室"); return TRUE; / return TRUE unless you set the focus to a control (13)给主对话框CChatClientDlg增加一个CListBox类型的变量m_strMsg。 (14)给住对话框CChatClientDlg增

13、加一个输入发送信息的编辑框,并生成对应的CString类型的变量m_strMsg。(15)给主对话框CChatClientDlg增加一个send按钮,其响应函数定义如下:void CChatClientDlg:OnSend() /响应控件send UpdateData(TRUE); SendMsg(m_strMsg);m_strMsg.Empty();/清空编辑区 UpdateData(FALSE); (16)给主对话框增添一个离开按钮,其响应函数定义如下:void CChatClientDlg:leave()/离开 SendMsg("离开聊天室"); m_ctrlMsgs

14、.AddString("离开状态");m_pSocket->Close();(17)给主对话框增添一个连接按钮,其响应函数如下:void CChatClientDlg:land()/连接OnInitDialog();四、系统的数据设计没有涉与到数据设计,只有文件保存。五、系统的实现与调试1.服务端初始化, 进入聊天室界面:2.客户端初始化,端口号与服务器对应:4. 进入聊天界面:5.聊天室显示进入的客户:6.另一个客户进入聊天室:7.在客户界面上显示聊天界面:8.在聊天室界面上显示所有客户的聊天记录:9.显示何留根离开聊天室:10.在何留根的聊天界面上显示离开状态:1

15、1.显示何留根又进入聊天室:五、系统的实现与调试我做的是“网络聊天程序”,这个程序是和何留根同学合作的,通过做这个系统,我巩固和运用了很多课上学过的知识,也学会了很多课上没有讲过的知识,感受到了解课外知识的重要性,可谓是受益匪浅。在最开始建立工程时就犯了一个很大的错误,建错了工程,以致在建类时总是出错,浪费了几个小时才发现要建基于对话框的程序。这就体现了上课听讲的重要性,由于一时的疏忽又很有可能造成无可挽回的错误。我们做的系统很小,如果这是一个巨大工程,犯了这样一个错误,那是致命的。但是,话说回来,这不叫浪费时间,我们要吃一堑长一智,下次要记住,做工程,从第一步就应该认认真真,踏踏实实,避免出

16、错。已进入工程,首先就做好了所有的界面设计。其中又遇到了很多困难。在插入位图时,要调整位图的大小,这是我不知道的,通过参考书和讨论终于完成这一步。从中,我更加坚定了讨论的重要作用。其次,代码部分很多很复杂,但是结构确是很清晰的。我想这应该是MFC的一个很大的优点。根据参考书上的讲解和自己的揣摩,我明白了整个算法的灵魂。这个程序讲的是通信,互联网上关于聊天功能的工具非常多,但是其实现技术都是小异。我们做的这个系统是用WINSOCK实现的最简单的聊天,能够发送信息至服务器,。把通信的思想转化成语言的过程,靠的是C+的基础。实现过程中犯了很多错误,真的很后悔基础功不牢固,现在就要付出更多的时间来弥补

17、。有些人,可以随口说出那些常用的函数,走了一条捷径,而不知道的人,就要花时间去找那个函数,或者说自己写代码来实现那个函数的功能。所以,从现在开始,我会认真面对每一次编程,即使是小程序,也一样能锻炼人。到这,这个学期的MFC学习结束了,但对知识的追求还没有结束,我们会的只是知识海洋里的一瓢水,还有更多的东西需要我们去钻研。不能说自己会有多高的觉悟,但小小的收益是无可否认的。最后,老师本学期的精心教导!附1:完成该系统的所有成员与其工作徐梦云:服务器户端的开发与美化,后期处理等。何根:客户端的开发与美化。附2:系统的主要程序代码void CListeningSocket:OnAccept(int

18、nErrorCode) /通知服务器,有客户端需要连接服务器CSocket:OnAccept(nErrorCode);/主对话框处理连接信息if(m_pDlg)m_pDlg->ProcessPendingAccept();void CClientSocket:OnReceive(int nErrorCode) /通知服务器可以接受数据CSocket:OnReceive(nErrorCode);if(m_pDlg) /让主对话框处理数据m_pDlg->ProcessPendingRead(this);void CChatServerDlg:ProcessPendingAccept()

19、/生成一个新的套节字与客户端通讯CClientSocket* pSocket = new CClientSocket(this);if (m_pSocket->Accept(*pSocket) /将该套节字保存起来m_connectionList.AddTail(pSocket);elsedelete pSocket;void CChatServerDlg:UpdateClients(char *buffer, int nBufferSize) /通知所有客户端更新消息for(POSITION pos = m_connectionList.GetHeadPosition();pos !=

20、 NULL;)/将新信息发送给每个客户端CClientSocket* pSocket= (CClientSocket*)m_connectionList.GetNext(pos);if (buffer != NULL)pSocket->Send(buffer,nBufferSize,0);void CChatServerDlg:Onsiliao() /将数据发送给指定客户int Position=m_people_num.GetCurSel();if(Position=-1)AfxMessageBox("没有选中联系人!",NULL,MB_OK);return ;in

21、tt=0;CString name,temp;m_people_num.GetText(Position,name); /得到选中人的for(POSITIONpos = m_connectionList.GetHeadPosition();pos != NULL; +cnt)/将新信息发送给指定客户端CClientSocket* pSocket= (CClientSocket*)m_connectionList.GetNext(pos);m_people_num.GetText(cnt,temp);if(temp=name)pSocket->Send(m_strMsg.GetBuffer(0),m_strMsg.GetLength(),0);break; UpdateData(1);/将数据在列表框中显示出来m_ctrlMsgs.AddString(m_strMsg);m_strMsg.Empty();/清空编辑区UpdateData(0);void CChatServerDlg:OnSave() ofstream outfile;outfile.open("ServerData.txt",ios:out|ios

温馨提示

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

评论

0/150

提交评论