下载
加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 MFC聊天软件课程设计---网络聊天程序设计

MFC聊天软件课程设计---网络聊天程序设计.doc

MFC聊天软件课程设计---网络聊天程序设计

说过不去想_却忘不了
2018-02-22 0人阅读 举报 0 0 暂无简介

简介:本文档为《MFC聊天软件课程设计---网络聊天程序设计doc》,可适用于综合领域

MFC聊天软件课程设计网络聊天程序设计面向对象程序设计课程设计设计说明书网络聊天程序设计起止日期:年月日至年月日学生姓名何刘根班级计本班学号成绩指导教师(签字)计算机与通信学院年月日网络聊天程序设计一、课题的介绍和课题的任务课题介绍:近年来随着PC的广泛应用和网络的不断发展目前网络技术已经成为了计算机领域内的最热门的发展方向。聊天室。在网络早期就开始盛行不论是BBSIRC都有类似网上聊天室的机制。聊天室适用于网上会议或闲聊的一些场合。聊天室为网友提供了较好的交友环境网友之间相互以文字交谈在形式上有点类似笔友的性质却大大节省了书信往返的时间这也是网上交友之所以如此热门的原因。课题任务:、综合运用本课程及计算机网络的相关知识设计并实现一个网络应用程序以VisualC作为开发平台通过实践复习巩固课堂所学的理论知识提高对所学知识的综合应用能力进一步加强winsock编程技术。、采用客户服务器模式分为客户端程序和服务器程序。服务器采用WINSOCKIO模型中的任一种支持多个客户同时在线聊天。客户端程序和服务器程序通过网络交换聊天字符串内容服务器窗口的列表框中显示当前在线用户支持服务器与客户端之间的私聊二、设计的要求、用WINSOCK实现简单的网络聊天、在MFC开发平台上编写一个聊天系统、得server和client之间可以相互通信、多人能够发送信息至服务器首先显示进入聊天室的成员名然后显示对方名字和聊天信息可以并发执行。、服务器与单个客户端之间可以进行私聊三、系统的分析和系统中类的设计在此主要介绍服务器端的构建(即本人所负责的部分)不是本人负责的部分不过多介绍建立连接过程流程图如下:Server端Client端创建CClientSocket对象在某个端口提供监听服务等待来自Client端的服务请求创建CChatSocket对象向Server的监听端口发出请求接受Client端的请建立连接求用返回的CClientSocket建立连接向用向用CChatSocket数据通路CClientSocket连连接建立的流中读接建立的流中读写数据写数据关闭关闭CClientSocket拆除链路CChatSocket结结束与当前Client的束与当前Server端通信等待其他请求的通信关闭CClientSocket对象结束监听服务程序个模块代码如下:客户端()通过AppWizard生成基于对话框的应用程序ChatClient在向导的第二步选择WindowsSockets的支持其余步骤均用默认值。()增加一个登录服务器的对话框资源其ID为IDDSETUP然后通过ClassWizard生成对应的基于CDialog的类CSetupDlg。()给对话框CSetupDlg增加个编辑框用来输入登录信息(聊天代号、服务器地址以及服务器端口号)()通过ClassWizard生成对应的基于CSocket的类CChatSocket。()给CChatSocket类声明一个主对话框CChatClientDlg指针类型的私有成员变量其代码如下:protected:CChatClientDlg*mpDlg并且在ChatSocket类的头文件开始处增加如下代码:classCChatClientDlg主对话框类()给ChatSocket类重载一个构造函数其定义如下:CChatSocket::CChatSocket(CChatClientDlg*pDlg){mpDlg=pDlg}并且在ChatSocket类的CPP文件开始处增加如下语句:#include"ChatClientDlgh"()通过ClassWizard响应类的ChatSocket的OnReceive函数表示可以接收数据了其代码如下:通知客户端可以接受数据voidCChatSocket::OnReceive(intnErrorCode){CSocket::OnReceive(nErrorCode)if(mpDlg){PlaySound("F:msgwav",,SNDASYNC|SNDNODEFAULT)>ProcessPendingRead()mpDlg}})在主对话框ChatClientDlg的头文件中定义ChatSocket指针类型的私有(成员变量其代码如下:CChatSocket*mpSocket并且在CChatClientDlg类的头文件开始处增加如下代码:classCChatSocket基于CSocket的新类CChatSocket()给对话框CChatClientDlg增加处理接收数据的共有成员函数ProcessPendingRead其定义如下:voidCChatClientDlg::ProcessPendingRead()处理接收的数据{定义缓冲区charbufferBUFFERSIZE接收数据intnReceived=mpSocket>Receive(buffer,BUFFERSIZE,)buffernReceived=将数据在列表框中显示出来CStringstrstrFormat("s",buffer)mctrlMsgsAddString(str)}()给对话框CChatClientDlg增加发送数据的私有成员函数SendMsg:发送数据到服务器voidCChatClientDlg::SendMsg(CStringstrMsg){CStringstrstrFormat("s:s",mstrClientName,strMsg)mpSocket>Send(strGetBuffer(),strGetLength(),)}并且在CChatClientDlg类的头文件开始处定义缓冲区的大小其代码如下:#defineBUFFERSIZE()给对话框CChatClientDlg增加表示聊天代号的CString类型私有成员变量mstrClientName。()在对话框CChatClientDlg的OnInitialUpdate函数中增加登录服务器的代码:BOOLCChatClientDlg::OnInitDialog()登录服务器{CDialog::OnInitDialog()ASSERT((IDMABOUTBOXxFFF)==IDMABOUTBOX)ASSERT(IDMABOUTBOX<xF)CMenu*pSysMenu=GetSystemMenu(FALSE)if(pSysMenu!=){CStringstrAboutMenustrAboutMenuLoadString(IDSABOUTBOX)if(!strAboutMenuIsEmpty()){pSysMenu>AppendMenu(MFSEPARATOR)pSysMenu>AppendMenu(MFSTRING,IDMABOUTBOX,strAboutMenu)}}SetIcon(mhIcon,TRUE)SetbigiconSetIcon(mhIcon,FALSE)Setsmallicon显示登录对话框CSetupDlgdlgif(dlgDoModal()==IDOK){创建一个新的SocketmpSocket=newCChatSocket(this)if(!mpSocket>Create()){deletempSocketmpSocket=AfxMessageBox("createsocketfailed")returnFALSE}连接服务器while(!mpSocket>Connect(dlgmstrServer,dlgmnPort)){if(AfxMessageBox("FailedtoconnecttoservernTryagain",MBYESNO)==IDNO){deletempSocketmpSocket=returnFALSE}}mstrClientName=dlgmstrName}elsereturnFALSE发送登录消息给服务器SendMsg("进入聊天室")returnTRUEreturnTRUEunlessyousetthefocustoacontrol}()给主对话框CChatClientDlg增加一个CListBox类型的变量mstrMsg。()给住对话框CChatClientDlg增加一个输入发送信息的编辑框并生成对应的CString类型的变量mstrMsg。()给主对话框CChatClientDlg增加一个【send】按钮其响应函数定义如下:voidCChatClientDlg::OnSend()响应控件send{UpdateData(TRUE)SendMsg(mstrMsg)mstrMsgEmpty()清空编辑区UpdateData(FALSE)}()给主对话框增添一个【离开】按钮其响应函数定义如下:{voidCChatClientDlg::leave()离开SendMsg("离开聊天室")mctrlMsgsAddString("离开状态")mpSocket>Close()}()给主对话框增添一个【连接】按钮其响应函数如下:voidCChatClientDlg::land()连接{OnInitDialog()}四、系统的数据设计没有涉及到数据设计只有文件保存。五、系统的实现及调试服务端初始化,进入聊天室界面:客户端初始化端口号与服务器对应:进入聊天界面:聊天室显示进入的客户:另一个客户进入聊天室:在客户界面上显示聊天界面:在聊天室界面上显示所有客户的聊天记录:显示何留根离开聊天室:在何留根的聊天界面上显示离开状态:显示何留根又进入聊天室:五、系统的实现及调试我做的是“网络聊天程序”这个程序是和何留根同学合作的通过做这个系统我巩固和运用了很多课上学过的知识也学会了很多课上没有讲过的知识感受到了解课外知识的重要性可谓是受益匪浅。在最开始建立工程时就犯了一个很大的错误建错了工程以致在建类时总是出错浪费了几个小时才发现要建基于对话框的程序。这就体现了上课听讲的重要性由于一时的疏忽又很有可能造成无可挽回的错误。我们做的系统很小如果这是一个巨大工程犯了这样一个错误那是致命的。但是话说回来这不叫浪费时间我们要吃一堑长一智下次要记住做工程从第一步就应该认认真真踏踏实实避免出错。已进入工程首先就做好了所有的界面设计。其中又遇到了很多困难。在插入位图时要调整位图的大小这是我不知道的通过参考书和讨论终于完成这一步。从中我更加坚定了讨论的重要作用。其次代码部分很多很复杂但是结构确是很清晰的。我想这应该是MFC的一个很大的优点。根据参考书上的讲解和自己的揣摩我明白了整个算法的灵魂。这个程序讲的是通信互联网上关于聊天功能的工具非常多但是其实现技术都是大同小异。我们做的这个系统是用WINSOCK实现的最简单的聊天能够发送信息至服务器。把通信的思想转化成语言的过程靠的是C的基础。实现过程中犯了很多错误真的很后悔基础功不牢固现在就要付出更多的时间来弥补。有些人可以随口说出那些常用的函数走了一条捷径而不知道的人就要花时间去找那个函数或者说自己写代码来实现那个函数的功能。所以从现在开始我会认真面对每一次编程即使是小程序也一样能锻炼人。到这这个学期的MFC学习结束了但对知识的追求还没有结束我们会的只是知识海洋里的一瓢水还有更多的东西需要我们去钻研。不能说自己会有多高的觉悟但小小的收益是无可否认的。最后谢谢彭老师本学期的精心教导~附:完成该系统的所有成员名单及其工作徐梦云:服务器户端的开发及美化后期处理等。何刘根:客户端的开发及美化。附:系统的主要程序代码voidCListeningSocket::OnAccept(intnErrorCode)通知服务器有客户端需要连接服务器{CSocket::OnAccept(nErrorCode)主对话框处理连接信息if(mpDlg)mpDlg>ProcessPendingAccept()}voidCClientSocket::OnReceive(intnErrorCode){通知服务器可以接受数据CSocket::OnReceive(nErrorCode)if(mpDlg){让主对话框处理数据mpDlg>ProcessPendingRead(this)}}voidCChatServerDlg::ProcessPendingAccept(){生成一个新的套节字与客户端通讯CClientSocket*pSocket=newCClientSocket(this)if(mpSocket>Accept(*pSocket)){将该套节字保存起来mconnectionListAddTail(pSocket)}else{deletepSocket}}voidCChatServerDlg::UpdateClients(char*buffer,intnBufferSize)通知所有客户端更新消息{for(POSITIONpos=mconnectionListGetHeadPosition()pos!=){将新信息发送给每个客户端CClientSocket*pSocket=(CClientSocket*)mconnectionListGetNext(pos)if(buffer!=)pSocket>Send(buffer,nBufferSize,)}}voidCChatServerDlg::Onsiliao(){将数据发送给指定客户intPosition=mpeoplenumGetCurSel()if(Position==){AfxMessageBox("没有选中联系人!",,MBOK)return}intcnt=CStringname,tempmpeoplenumGetText(Position,name)得到选中人的姓名for(POSITIONpos=mconnectionListGetHeadPosition()pos!=cnt){将新信息发送给指定客户端CClientSocket*pSocket=(CClientSocket*)mconnectionListGetNext(pos)mpeoplenumGetText(cnt,temp)if(temp==name){pSocket>Send(mstrMsgGetBuffer(),mstrMsgGetLength(),)break}}UpdateData()将数据在列表框中显示出来mctrlMsgsAddString(mstrMsg)mstrMsgEmpty()清空编辑区UpdateData()}voidCChatServerDlg::OnSave(){ofstreamoileoileopen("ServerDatatxt",ios::out|ios::app)以追加打开文件if(!oile){MessageBox("保存失败!",,MBOK)return}CStringstrstringsinti,nfor(i=i<mctrlMsgsGetCount()i)遍历ListBox{n=mctrlMsgsGetTextLen(i)mctrlMsgsGetText(i,strGetBuffer(n))s=str把CString转换string,否则乱码oile<<s<<endl}oileclose()}voidCChatServerDlg::OnRead(){ifstreaminfile("ServerDatatxt")读取文件if(!infile){MessageBox("亲木有聊天记录哦!",,MBOK)return}charsCStringtempwhile(infilegetline(s,,'n')){stringstr(s)tempFormat("s",strcstr())((CChatServerDlg*)(AfxGetApp()>mpMainWnd))>mctrlMsgsAddString(temp)((CChatServerDlg*)(AfxGetApp()>mpMainWnd))>mctrlMsgsSetTopIndex()}infileclose()}

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/19

MFC聊天软件课程设计---网络聊天程序设计

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利