ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:432.11KB ,
资源ID:3301991      下载积分:2 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3301991.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(MFC课程设计报告聊天室程序设计.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

MFC课程设计报告聊天室程序设计.docx

1、MFC课程设计报告聊天室程序设计 MFC课程设计报告题 目 聊天室程序设计 学 号 专 业 计算机科学与技术 授课班号 学生姓名 指导教师 完成时间 2008.12.30 题目:设计一个聊天室系统,实现多人一起聊天。一.引言1.1开发背景随着网络信息时代的来临,INTERNET应用越来越广泛,人们越来越习惯于在网上获取和交流信息。据调查显示,80%以上的人上网都会打开聊天工具来聊天,而几乎每一个年轻人都会去聊天。使用网上聊天已经成为现代年轻人一种新的交往方式。聊天室更适合于陌生人之间进行较为主观、感兴化的讨论。所以有大部分的人会进入聊天室聊天,它会给人一个完全自由的聊天世界。因此我联系所学的M

2、FC知识,决定做一个简易的聊天室程序。1.2开发环境以及运行环境1.2.1开发环境Intel Pentium 4 2.0GHz,512M内存,80G硬盘Microsoft Windows XP ProfessionalMicrosoft Visual C+ 6.01.2.2运行环境Intel Pentium 2及以上处理器,32M以上内存,4G以上硬盘Microsoft Windows XP操作系统800*600或以上的屏幕分辨率二需求分析1、用WINSOCK实现简单的网络聊天;2、在MFC开发平台上编写一个聊天系统; 3、得server和client之间可以相互通信; 4、多人能够发送信息至

3、服务器,首先显示进入聊天室的成员名,然后显示对方名字和聊天信息,可以并发执行。三、算法分析 建立连接过程流程图如下: 四、详细设计程序个模块代码如下: 1.客户端 (1)通过AppWizard生成基于对话框的应用程序ChatClient,在向导的第二步选择WindowsSockets的支持,其余步骤均用默认值。 (2)增加一个登录服务器的对话框资源,其ID为IDD_SETUP,然后通过ClassWizard生成对应的基于CDialog的类CSetupDlg。 (3)给对话框CSetupDlg增加3个编辑框,用来输入登录信息(聊天代号、服务器地址以及服务器端口号), (4)通过ClassWiza

4、rd生成对应的基于CSocket的类CChatSocket。 (5)给CChatSocket类声明一个主对话框CChatClientDlg指针类型的私有成员变量,其代码如下: protected: CChatClientDlg* m_pDlg;并且在ChatSocket类的头文件开始处增加如下代码:class CChatClientDlg; /主对话框类 (6)给ChatSocket类重载一个构造函数,其定义如下: CChatSocket:CChatSocket(CChatClientDlg* pDlg) m_pDlg = pDlg;并且在ChatSocket类的CPP文件开始处增加如下语句:

5、#include ChatClientDlg.h (7)通过ClassWizard响应类的ChatSocket的OnReceive函数,表示可以接收数据了,其代码如下:/通知客户端可以接受数据void CChatSocket:OnReceive(int nErrorCode) CSocket:OnReceive(nErrorCode); if(m_pDlg) PlaySound(F:msg.wav,NULL,SND_ASYNC|SND_NODEFAULT); m_pDlg-ProcessPendingRead(); (8)在主对话框ChatClientDlg的头文件中定义ChatSocket指

6、针类型的私有成员变量,其代码如下:CChatSocket* m_pSocket;并且在CChatClientDlg类的头文件开始处增加如下代码:class CChatSocket;/基于CSocket的新类CChatSocket (9)给对话框CChatClientDlg增加处理接收数据的共有成员函数ProcessPendingRead,其定义如下:void CChatClientDlg:ProcessPendingRead()/处理接收的数据 /定义缓冲区 char bufferBUFFER_SIZE; /接收数据 int nReceived = m_pSocket-Receive(buff

7、er,BUFFER_SIZE,0); buffernReceived = 0; /将数据在列表框中显示出来 CString str; str.Format(%s,buffer); m_ctrlMsgs.AddString(str); (10)给对话框CChatClientDlg增加发送数据的私有成员函数SendMsg:/发送数据到服务器void CChatClientDlg:SendMsg(CString strMsg) CString str; str.Format(%s:%s,m_strClientName,strMsg); m_pSocket-Send(str.GetBuffer(0),

8、str.GetLength(),0);并且在CChatClientDlg类的头文件开始处定义缓冲区的大小,其代码如下:#define BUFFER_SIZE 200 (11)给对话框CChatClientDlg增加表示聊天代号的CString类型私有成员变量m_strClientName。 (12)在对话框CChatClientDlg的OnInitialUpdate函数中增加登录服务器的代码:BOOL CChatClientDlg:OnInitDialog()/登录服务器 CDialog:OnInitDialog(); ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_A

9、BOUTBOX); ASSERT(IDM_ABOUTBOX 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_pSocket = new CChatSocket(this); if (!m_pS

10、ocket-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?,MB_YESNO) = IDNO) delete m_pSocket; m_pSocket = NULL; return FALSE; m_str

11、ClientName = 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增加一个输入发送信息的编辑框,并生成对应的CString类型的变量m_strMsg。(15)给主对话框CChatClientDlg增加一个【send】按钮,其响应函数定义如下

12、:void CChatClientDlg:OnSend() /响应控件send UpdateData(TRUE); SendMsg(m_strMsg); m_strMsg.Empty();/清空编辑区 UpdateData(FALSE); (16)给主对话框增添一个【离开】按钮,其响应函数定义如下:void CChatClientDlg:leave()/离开 SendMsg(离开聊天室); m_ctrlMsgs.AddString(离开状态); m_pSocket-Close();(17)给主对话框增添一个【连接】按钮,其响应函数如下:void CChatClientDlg:land()/连接

13、 OnInitDialog();2.服务器端 (1)通过AppWizard生成基于对话框的应用程序ChatServer,在向导的第二步选择WindowsSockets的支持,其余步骤均用默认值。 (2)增加一个登录服务器的对话框资源,其ID为IDD_INT,然后通过ClassWizard生成对应的基于CDialog的类CInitDlg。 (3)给对话框CInitDlg增加1个输入端口号的编辑框,并生成对应的整形变量m_nPort。 (4)通过ClassWizard生成对应的基于CSocket的类CListeningSocket,用来监听服务器。 (5)给CListeningSocket类声明一

14、个主对话框CChatServerDlg指针类型的私有成员变量,其代码如下: protected: CChatServerDlg* m_pDlg;并且在CListeningSocket类的头文件开始处增加如下代码:class CChatServerDlg; /主对话框类 (6)给ChatSocket类重载一个构造函数,其定义如下: CChatSocket:CClientSocket(CChatServerDlg* pDlg) m_pDlg = pDlg; 并且在CListeningSocket类的CPP文件开始处增加如下语句:#include ChatServerDlg.h (7)通过Class

15、Wizard响应类的CListeningSocket的OnAccept函数,表示客户端连接,其代码如下:void CListeningSocket:OnAccept(int nErrorCode) /通知服务器,有客户端需要连接服务器 CSocket:OnAccept(nErrorCode); /主对话框处理连接信息 if(m_pDlg) m_pDlg-ProcessPendingAccept(); (8)通过ClassWizard生成基于CSocket的新类CClientSocket,用来与客户端通信。(9)给CClientSocket类声明一个主对话框CChatServerDlg指针类型的

16、私有成员变量,其代码如下:protected: CChatServerDlg* m_pDlg;并且在CClientSocket类的头文件开始处增加如下语句:class CChatServerDlg;(10)给CClientSocket类重载一个构造函数,其定义如下:CClientSocket:CClientSocket(CChatServerDlg* pDlg) m_pDlg = pDlg;并且在CClientSocket类的CPP文件开始处增加如下语句:#include ChatServerDlg.h(11)通过ClassWizard响应类的CClientSocket的OnReceive函数

17、,表示数据已到达,其代码如下:void CClientSocket:OnReceive(int nErrorCode) /通知服务器可以接受数据 CSocket:OnReceive(nErrorCode); if(m_pDlg) /让主对话框处理数据 m_pDlg-ProcessPendingRead(this); (12)在主对话框CChatServerDlg的头文件那个增加两个私有成员变量,其代码如下: CListeningSocket* m_pSocket; /监听套节字 CPtrList m_connectionList; /客户端套节字链表并且在CChatSvrDlg的头文件开始处增

18、加如下代码:class CListeningSocket;class CClientSocket;(13)给主对话框CChatSvrDlg增加处理客户端连接信息的私有成员变量ProcessPendingAccept,其定义如下:void CChatServerDlg:ProcessPendingAccept() /生成一个新的套节字与客户端通讯 CClientSocket* pSocket = new CClientSocket(this); if (m_pSocket-Accept(*pSocket) /将该套节字保存起来 m_connectionList.AddTail(pSocket);

19、 else delete pSocket;(14)给主对话框CChatSvrDlg增加更新所有客户端的私有成员函数UpdateClient,其定义如下:void CChatServerDlg:UpdateClients(char* buffer,int nBufferSize) for(POSITION pos = m_connectionList.GetHeadPosition(); pos != NULL;) /将新信息发送给每个客户端CClientSocket* pSocket= (CClientSocket*)m_connectionList.GetNext(pos); if (buf

20、fer != NULL) pSocket-Send(buffer,nBufferSize,0); (15)给主对话框CChatSvrDlg增加接受数据的私有成ProcessPendingRe,其定义如下:void CChatServerDlg:ProcessPendingRead(CClientSocket* pSocket) /定义缓冲区 char bufferBUFFER_SIZE; /接收数据 int nReceived = pSocket-Receive(buffer,BUFFER_SIZE,0); buffernReceived = 0; /将数据在列表框中显示出来 m_ctrlMs

21、gs.AddString(buffer);/将数据发送给每个客户 UpdateClients(buffer,nReceived);并且在CChatSvrDlg类的头文件开始处定义缓冲区的大小,其代码如下:#define BUFFER_SIZE 200(16)给主对话框CChatSvrDlg的OnInitialUpdate函数中显示初始化对话框,其定义如下:BOOL CChatServerDlg:OnInitDialog() CDialog:OnInitDialog(); ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX); ASSERT(IDM_ABOU

22、TBOX AppendMenu(MF_SEPARATOR); pSysMenu-AppendMenu(MF_STRING,IDM_ABOUTBOX, strAboutMenu); SetIcon(m_hIcon, TRUE); / Set big icon SetIcon(m_hIcon, FALSE); / Set small icon /弹出初始话对话框 CInitDlg dlg; if (dlg.DoModal() = IDOK) /创建监听套节字 m_pSocket = new CListeningSocket(this); if (m_pSocket-Create(dlg.m_nPo

23、rt+700) if (m_pSocket-Listen() return TRUE; else return FALSE; else return FALSE; return TRUE; / return TRUE unless you set the focus to a control五、运行结果如下: 1.服务端初始化, 进入聊天室界面:3.客户端初始化,端口号与服务器对应:4. 进入聊天界面:5.聊天室显示进入的客户:6.另一个客户进入聊天室:7.在客户界面上显示聊天界面: (芳菲燕)(卡罗)8.在聊天室界面上显示所有客户的聊天记录:9.显示芳菲燕离开聊天室:10.在芳菲燕的聊天界面

24、上显示离开状态:11.显示芳菲燕又进入聊天室:六、课程设计心得:我做的是“聊天室”系统,这个程序是和钟宏运同学合作的,他教会了我很多东西。通过做这个系统,我巩固和运用了很多课上学过的知识,也学会了很多课上没有讲过的知识,感受到了解课外知识的重要性,可谓是受益匪浅。 在最开始建立工程时就犯了一个很大的错误,间错了工程,以致在建类时总是出错,浪费了几个小时才发现要建基于对话框的程序。这就体现了上课听讲的重要性,由于一时的疏忽又很有可能造成无可挽回的错误。我们做的系统很小,如果这是一个巨大工程,犯了这样一个错误,那是致命的。但是,话说回来,这不叫浪费时间,我们要吃一堑长一智,下次要记住,做工程,从第

25、一步就应该认认真真,踏踏实实,避免出错。已进入工程,首先就做好了所有的界面设计。其中又遇到了很多困难。在插入位图时,要调整位图的大小,这是我不知道的,通过参考书和讨论终于完成这一步。从中,我更加坚定了讨论的重要作用。 其次,代码部分很多很复杂,但是结构确是很清晰的。我想这应该是MFC的一个很大的优点。根据参考书上的讲解和自己的揣摩,我明白了整个算法的灵魂。这个程序讲的是通信,互联网上关于聊天功能的工具非常多,但是其实现技术都是大同小异。我们做的这个系统是用WINSOCK实现的最简单的聊天,多人能够发送信息至服务器,服务器首先显示进入聊天室的成员名,然后显示对方名字和聊天信息,而且可以并发执行。

26、把通信的思想转化成语言的过程,靠的是C+的基础。实现过程中犯了很多错误,真的很后悔基础功不牢固,现在就要付出更多的时间来弥补。最近有很多专业课的要做课程设计,每一次任务的完成,都会很有成就感,发现经验真的很宝贵。有些人,可以随口说出那些常用的函数,走了一条捷径,而不知道的人,就要花时间去找那个函数,或者说自己写代码来实现那个函数的功能。所以,从现在开始,我会认真面对每一次编程,即使是小程序,也一样能锻炼人。到这,这个学期的MFC学习结束了,但对知识的追求还没有结束,我们会的只是知识海洋里的一瓢水,还有更多的东西需要我们去钻研。不能说自己会有多高的觉悟,但小小的收益是无可否认的。最后,谢谢景老师本学期的精心教导!

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1