(VC+MFC网络聊天工具)详细设计
计算机网络---聊天工具设计
聊天工具设计目的、需求1、建立MFC工程2、插入对话框右侧对话框,左侧工具栏一、设计对话框界面1.设置对话框属性2、静态文本控件3.编辑控件3.组框4.单选框5.复选框6.列表框7.组合框PS:更改控件的ID号和标题二、为设计好的对话框添加类(为对话框添加相应的类才能使用对话框)1、2、CChatDlg ,类名的第一个C字母代表一个“类(class)”.Classname 中出现CChartDlg,表明类已经添加成功。
3、为对话框中的控件添加变量接步骤(2),开始:点击Member Variables选项卡,表中列出ID控件,4、为所有控件添加变量如图所示:5、控件变量的意义:6、CChatDlg.cpp文件中对成员函数变量进行初始化CChatDlg::CChatDlg(CWnd* pParent /*=NULL*/) : CDialog(CChatDlg::IDD, pParent){//{{AFX_DATA_INIT(CChatDlg)m_computer = _T("");m_connect = _T("");m_example = _T("");m_ip = _T("");m_ipport = _T("");m_message = _T("");m_otherview = _T("");m_port = _T("");m_recordvew = _T("");m_serve = -1;//}}AFX_DATA_INIT}三、为组合框和列表框添加初始化内容OnInitDialog()函数,初始化内容在OnInitDialog()函数中添加。
1.因为OnInitDialog()函数是VM_INITDIALOG消息的响应函数,所以我们使用添加消息响应函数的方法添加OnInitDialog()函数。
MFC聊天软件课程设计---网络聊天程序设计
MFC聊天软件课程设计网络聊天程序设计面向对象程序设计课程设计设计说明书网络聊天程序设计起止日期:2012年5月27日至2012年6月1日学生姓名何刘根班级计本103班学号10408100301 成绩指导教师(签字)计算机与通信学院2012 年 5 月30 日网络聊天程序设计一、课题的介绍和课题的任务课题介绍:近年来随着PC的广泛应用和网络的不断发展,目前网络技术已经成为了计算机领域内的最热门的发展方向。
聊天室。
在网络早期就开始盛行,不论是BBS,IRC 都有类似网上聊天室的机制。
聊天室适用于网上会议或闲聊的一些场合。
聊天室为网友提供了较好的交友环境,网友之间相互以文字交谈,在形式上有点类似笔友的性质,却大大节省了书信往返的时间,这也是网上交友之所以如此热门的原因。
课题任务:1、综合运用本课程及计算机网络的相关知识设计并实现一个网络应用程序,以Visual C++6.0 作为开发平台,通过实践复习巩固课堂所学的理论知识,提高对所学知识的综合应用能力,进一步加强winsock 编程技术。
2、采用客户/ 服务器模式,分为客户端程序和服务器程序。
服务器采用WINSOCK I/O莫型中的任一种,支持多个客户同时在线聊天。
客户端程序和服务器程序通过网络交换聊天字符串内容,服务器窗口的列表框中显示当前在线用户,支持服务器与客户端之间的私聊二、设计的要求1、用WINSOC实现简单的网络聊天;2、在MFC开发平台上编写一个聊天系统;3、得server 和client 之间可以相互通信;4、多人能够发送信息至服务器,首先显示进入聊天室的成员名,然后显示对方名字和聊天信息,可以并发执行。
5、服务器与单个客户端之间可以进行私聊三、系统的分析和系统中类的设计在此主要介绍服务器端的构建(即本人所负责的部分),不是本人负责的部分不过多介绍建立连接过程流程图如下:1Server 端Client 端创建CClientSocket对象,在某个端口提供监听服务等待来自Client端的服务请求创建CChatSocket 对象,向Server 的监听端口发出请求接受Client 端的请建立连接求,用返回的CClientSocket 建立连接向用向用CChatSocket 数据通路CClientSocket 连连接建立的流中读接建立的流中读写数据写数据关闭关闭CClientSocket,拆除链路CChatSocket,结结束与当前Client的束与当前Server 端通信,等待其他请求的通信关闭CClientSocket 对象,结束监听服务程序个模块代码如下:1. 客户端(1)通过AppWizard 生成基于对话框的应用程序ChatClient ,在向导的第二步选择WindowsSockets的支持,其余步骤均用默认值。
基于VC(MFC)的网络监控、聊天软件的设计
基于VC(MFC)的网络监控、聊天软件的设计目的:通过对C++编程语言的学习结合易思博公司的具体项目实例提高理论联系实际的能力以及通过公司员工式的的要求和上班制度和项目要求,锻炼学生以后走出社会参加工作后的职业所需要的素质和习惯,以提高学生的社会适应能力和项目技术开发的科研能力。
培训单位及职位信息:(1)实习单位深圳易思博有限公司软酷实验室(2)实习岗位:软件开发员,负责项目的外包以及实现。
任务:通过对C++的语言和Visual C++的学习,基于MFC平台搭建一个软酷实验室网络监控平台。
形式和安排及步骤:(1)项目分工:实习具体安排是以小组的形式去去实现项目工程的展开的:一个小组四个人的形式,首先是对项目模块的划分以及分工:窗口界面设计模块、数据库建立和连接更新模块、socket通信模块。
其中本人负责的是窗口设计模块和socket通信模块,由于窗口设计部分比较容易实现,但也涉及到整个系统的架构和实现,所以一旦完成这个模块很快就转到socket编程模块了。
(2)项目报告:小组每周以小组形式提交一份项目周报,其格式严格按照公司提供的表格进行填写,另外每人每周提交一次周项目总结,每天提交一个项目日志。
(3)加强学习部分:对项目边界等技术难点进行视频培训以及自学的形式进行基础补给,为日后项目的开发顺利进行打下良好的基础。
(4)项目开发:各小组对项目的分工进行项目开发。
(5)项目提交报告:小组最终以最终的项目程序的形式上交到公司最后由项目经理等验收,验收过程要求附带ppt演讲和答疑;内容:(1)软酷实验室网络监控系统的应用以及简介:随着社会的发展,科技的进步,作为信息载体的计算机网络通信日益显露出其举足轻重的地位。
当今社会已步入了信息社会,知识经济将成为新世纪的主导产业。
伴随计算机网络技术的的逐步推进应用,计算机通信以及监控系统已在科研、生产、商业、服务等许多方面创造了提高效率的途径。
我们应该尽快使用现代化管理设备、管理手段、管理方法。
MFC实现简单网络聊天程序
MFC实现简单网络聊天程序MFC(Microsoft Foundation Classes)是微软公司提供的一个应用程序框架,用于开发Windows系统上的图形用户界面程序。
在此基础上,我们可以利用MFC来实现简单的网络聊天程序。
首先,我们需要创建一个MFC应用程序项目。
使用Visual Studio打开,选择MFC应用程序向导,选择对话框风格。
然后,设置对话框的布局,包括聊天消息显示框、消息输入框、发送按钮等控件。
接下来,我们需要使用Socket编程来实现网络通信功能。
MFC提供了CSocket类,我们可以使用它来处理数据的发送和接收。
在对话框类中添加成员变量m_socket,类型为CSocket。
在OnInitDialog函数中,我们需要创建Socket,并进行连接。
可以通过使用Create函数创建CSocket对象,并调用Connect函数来连接指定的地址和端口号。
例如,可以连接到本地主机上的一些端口,这样就可以进行本地测试。
然后,我们需要添加事件处理函数来处理发送和接收消息。
当发送按钮被点击时,可以通过调用Socket对象的Send函数将消息发送给服务器。
可以使用CString类来处理字符串数据。
当接收到消息时,可以通过调用Socket对象的Receive函数将消息接收到的缓冲区中。
为了提供实时地聊天消息显示功能,我们需要使用SetWindowText函数将数据显示到聊天消息显示框中。
当接收到消息时,可以将消息显示在聊天消息显示框中,同时可以使用UpdateData函数实时更新界面。
在程序结束时,我们需要断开连接并销毁Socket对象。
在析构函数中,可以调用Shutdown函数来关闭连接,然后销毁Socket对象。
除了基本的发送和接收消息功能,我们还可以添加一些其他的功能,比如可以使用菜单栏来选择连接和断开服务器,可以添加登录和注册功能等。
这些可以根据实际需求进行扩展。
总结起来,通过使用MFC应用程序框架和Socket编程,我们可以实现简单的网络聊天程序。
C语言编写网络聊天工具
C语言编写网络聊天工具C语言作为一种高效、灵活的编程语言,在网络聊天工具的开发中扮演着重要的角色。
本文将介绍如何使用C语言编写一个简单的网络聊天工具,并着重讨论实时通信、消息传递和用户界面设计等方面的问题。
1. 引言在当今社交化的时代,网络聊天工具的需求日益增长。
通过网络聊天工具,人们可以方便地与他人进行沟通和交流,促进社会、工作和学习等各个方面的发展。
而C语言作为一种经典的编程语言,其能够提供高效的性能和灵活的功能,非常适合用于网络聊天工具的开发。
2. 网络编程基础在开始编写网络聊天工具之前,我们首先需要了解一些网络编程的基础知识。
C语言提供了一系列的库函数来实现网络编程功能,例如socket、bind、listen等等。
通过这些函数,我们可以建立服务器和客户端之间的通信连接,实现消息的传递和数据的交换。
3. 实时通信实时通信是网络聊天工具的核心功能之一。
在C语言中,我们可以使用套接字(socket)来实现实时通信。
服务器和客户端之间可以通过套接字进行连接,通过send和recv函数进行消息的发送和接收。
在实现实时通信时,我们需要考虑消息的封装和解析、连接的建立和维护、错误处理等方面的问题。
4. 用户界面设计用户界面设计是网络聊天工具的另一个重要方面。
通过一个友好、直观的用户界面,用户可以方便地进行操作和进行聊天。
在C语言中,我们可以使用图形库(如GTK+或Qt)或者命令行界面来实现用户界面。
不同的界面设计方案有不同的特点和适用场景,开发者可以根据实际需求选择合适的方案。
5. 消息传递在网络聊天工具中,消息的传递是至关重要的。
C语言提供了丰富的数据结构和函数来进行消息的封装和解析。
我们可以定义一个消息结构体,包含发送者、接收者、时间戳、内容等属性,通过函数进行消息的打包和解包。
同时,我们还可以使用消息队列、线程或者信号量等技术来实现多线程处理,提高并发性能。
6. 安全性和保密性在网络聊天工具的开发中,安全性和保密性是非常重要的考虑因素。
面向vc的网络聊天工具课程设计
目录第1章绪论 (1)1.1 项目开发的背景 (1)1.2 项目开发的主要内容 (1)1.3 项目开发的意义 (1)1.4 项目开发的过程 (2)第2章系统分析 (4)2.1 对已有聊天软件的分析 (4)2.2 系统有关的技术 (5)2.3 系统方案说明 (11)2.4 系统任务概述 (13)2.5 系统其他要求 (14)第3章系统设计 (16)3.1 系统的物理结构 (16)3.2 系统的软件结构 (17)3.3 系统数据结构设计 (20)3.4 系统界面设计 (23)第4章系统实现 (27)4.1 功能规定 (27)4.2几个主要的线程的程序设计 (32)4.3 源代码分析 (36)第5章测试与使用 (42)5.1 测试目标 (42)5.2 测试方式 (43)5.3 测试结果 (45)5.4 使用简介 (46)第6章总结 (48)参考文献 (51)第1章概论1.1 项目背景自从网络时代向我组成员迈进以来,计算机越来越走进人们的生活当中,特别是随着计算机网络的发展,把全世界的人们紧密的联系在一起,大大的扩展了计算机的功能,人们越来越离不开计算机了。
如今,作为网络应用之一的聊天工具,越来越受到人们的欢迎和重视。
现在已有的聊天软件和聊天工具不胜枚举,流行的主要有QQ,ICQ,MSN Message,NetMeeting,mIRC和郎码UC和各种的网页聊天室等。
这些软件特别是QQ升级很快,其功能是越来越来强大,把代表着聊天软件的发展方向。
目前,聊天软件的功能除了最基本的文本聊天,已经可以语音聊天,图像聊天,视频聊天,文件传输等三维聊天,还发展了短信发送,无线聊天,在线游戏等功能,可以预见在不久的把来,聊天软件把成为人们通过因特网相互联系和娱乐的主要平台。
然而这些软件的一个共同的缺点是采用了c/s的结构模式,如果服务器出现故障,则该聊天系统都把瘫痪。
该毕业设计课题为基于netbios的聊天工具的设计与实现,它是在netbios通信和文本聊天的基础上来实现语音聊天,文件传输。
VC聊天程序设计步骤
实验4 聊天程序【实验目的】⑴熟悉VisualC++的基本操作。
⑵基本了解基于对话框的windows应用程序的编写过程。
⑶对于Windows Socket编程建立初步概念。
【实验要求】⑴应用Visual C++中MFC CSocket类,实现网络数据传输。
⑵仿照本实验步骤,制作实用的局域网一对一聊天程序。
【实验原理】一、Windows Socket和套接口的基本概念网际协议(Internet Protocol,IP)是一种用于互联网的网络协议,已广为人知。
它可广泛用于大多数计算机操作系统上,也可用于大多数局域网LAN(比如办公室小型网络)和广域网W AN(比如说互联网)。
从它的设计看来,IP是一个无连接的协议,并不能保证数据投递万无一失。
两个上层协议(TCP和UDP)依赖IP 协议进行数据通信。
如果希望在Microsoft Windows下通过TCP和UDP协议建立网络应用程序,则需要使用Winsock套接口编程技术。
套接口,就是一个指向传输提供者的句柄。
Win32中,套接口不同于文件描述符,所以它是一个独立的类型——SOCKET。
Windows Sockets描述定义了一个Microsoft Windows的网络编程界面,它是从Unix Socket 的基础上发展而来的,为Windows TCP/IP 提供了一个BSD型的套接字规范,除与4.3BSD Unix Sockets完全兼容外,还包括一个扩充文件,通过一组附加的A PI实现Windows 式(即事件驱动)的编程风格;而Winsock则是在Microsoft Windows 中进行网络应用程序设计的接口。
Windows在Internet支配域中的TCP/IP协议定义了Winsock网络编程规范,融入了许多新特点。
使用Socket的目的是使用户在网络协议上工作而不必对该网络协议有非常深入的了解。
此外,编写的程序还可被迅速地移植到任何支持Socket的网络系统中去。
关于c编制的聊天工具
聊天服务器课程设计报告课程名称:年级:实验日期:姓名:学号:班级:课程设计名称:一、课程设计目的及要求设计一个聊天室,先启动服务器程序,弹出服务器初始化窗口,输入端口号,然后单击确定,弹出服务器的主窗口。
接着启动客户端程序,弹出客户端登录窗口,输入用户名,服务器地址和服务器端口,单击确定,弹出客户端主窗口。
在客户端输入信息,按发送,就可以在服务器显示出来,这就实现了一个聊天的基本功能。
二、课程设计环境Visual C++6.0三、课程设计步骤1、客户端(1)通过AppWizard生成的基于对话框的应用程序ChatClient,在向导的第二步选择WindowsSockets的支持,其余步骤均用默认值。
步骤:1)文件-新建,系统将显示NEW对话框。
2)选择工程标签,在显示的项目类型中选择MFC AppWizard(exe)3)在右边的名称编辑框输入项目名称,如ChatClient,然后按OK4)选择对话框应用程序,然后按下一步5) 在向导的第二步选择WindowsSockets的支持,单击下一步6)翻过后面的4个页面,都保持默认设置。
7)单击完成。
(2)增加一个登录服务器的对话框资源,其余ID设为IDD_SETUP,然后通过ClassWizard 生成对应的基于CDialog的类CSetupDlg。
步骤:在资源视图中,右击Dialog,选择“插入Dialog”,ID: IDD_SETUP基类:CDialog类:CSetupDlg(3)给对话框CSsetupDlg增加三个编辑框和三个静态文本框,并通过ClassWizard分别为三个编辑框生成对应的CString类型变量m_strName,CString类型变量m_StrSever和整型变量m_nPort。
(4)通过ClassWizard生成基于CSocket的新类CChatSocket。
步骤:ctrl+w打开类向导,单击“Add class”,选择”New”Name: CChatSocketBase class: CSocket(5)给CChatSocket类声明一个主对话框CChatClientDlg指针类型的私有成员变量,其代码如下:protected :CChatClientDlg* m_pDlg;步骤:在classview中,右击CChatSocket,添加成员变量类型:CChatClientDlg*名称; m_pDlgAccess:protected并且在CChatSocket类的头文件开始处增加如下代码:class CChatClientDlg;在Fileview 中,双击CChatSocket.h,添加class CChatClientDlg;(6)给CChatSocket类重载一个构造函数,在classview中,右击CChatSocket(),添加代码CChatSocket::CChatSocket(CChatClientDlg *pDlg){m_pDlg=pDlg;}并且在CChatSocket类的h文件开始处增加如下语句:在class CChatClientDlg;上面添加#include "ChatClientDlg.h"(7)通过ClassWizard响应类CChatSocket的OnReceive函数,表示可以接收数据了步骤:ctrl+w打开类向导,单击”MessageMaps”Classname: CChatSocket;objects: CChatSocket;messages: OnReceive添加代码:void CChatSocket::OnReceive(int nErrorCode){// TODO: Add your specialized code here and/or call the base classCSocket::OnReceive(nErrorCode);if(m_pDlg)m_pDlg->ProcessPendingRead();}(8)在主对话框CChatClientDlg的头文件中定义CChatSocket指针类型的私有成员变量,其代码如下:private:CChatSocket* m_pSocket;并且在CChatClientDlg类的头文件开始处增加如下代码:class CChatSocket;(9)给对话框CChatClientDlg增加处理接收数据的共有成员函数ProcessPendingRead,并添加代码步骤:在classview中,右击CChatClientDlg,选择“Add member Function”,类型:void描述:ProcessPendingReadAccess:public添加代码:void CChatClientDlg::ProcessPendingRead(){char buffer[BUFFER_SIZE];int nReceived=m_pSocket->Receive(buffer,BUFFER_SIZE,0);buffer[nReceived]=0;CString str;str.Format("%s",buffer);m_ctrlMsgs.AddString(str);}(10)给对话框CChatClientDlg增加发送数据的私有成员函数SendMsg,并添加代码在classview中,右击CChatClientDlg,选择“Add member Function”,类型:void描述:SendMsg(Access: private添加代码:void CChatClientDlg::SendMsg(CString strMsg){CString str;str.Format("%s:%s",m_strClientName,strMsg);m_pSocket->Send(str.GetBuffer(0),str.GetLength(),0);}并且在CChatClientDlg类的头文件开始处定义缓冲区的大小,其代码如下:#define BUFFER_SIZE 200步骤:在Fileview中,双击CChatClientDlg.h,在#endif下面添加#define BUFFER_SIZE 200(11)给对话框CChatClientDlg增加表示聊天代号的CString类型的私有成员变量m_strClientName。
(完整)基于MFC仿QQ聊天程序设计完整实例教程
本系统基于客户端/服务器基本原理,程序即是服务端,也是客户端,通过IP就可以相互添加好友,并且实现点到点通信,有聊天记录(未实现根据用户发送的消息而改变字体颜色,只能在客户端改),字体颜色设置(一改全改~),包含主界面MaindBord和聊天Talk两大功能模块。
(1) MaindBord模块A、登录模块登陆模块的实现过程有下面几个步骤:(1)初始化列表信息,获取用户名,服务器的IP地址,使按键失效(2)确认登陆后创建套接字,绑定,监听(3)初始化成功后,激活添加好友和隐藏功能B、好友模块添加好友的实现过程有下面几个步骤:(1)弹出对话框(2)获取对话框中的IP(3)检查对方是否在线,建立连接(4)发送请求验证C、好友列表模块(1)客户接收请求,将服务端加入列表,发送客户端信息(2)服务端得到客户端信息,加入列表(3)双击好友列表,弹出发送信息对话框D、隐藏模块(1)隐藏与显示(2)响应鼠标,弹出控制菜单(2)聊天Talk模块A、发送信息模块聊天模块中,发送信息模块的实现过程有下面几个步骤:(1)通过列表双击一个好友为聊天对象,弹出聊天窗口;(2)用户按下发送按钮后,检测对方是否在线,检测对方是否在线(3)将聊天内容发送出去(4)在本地即时聊天内容显示的编辑框中添加发送的内容并写入聊天记录。
B、接收信息模块聊天模块中,接收信息模块的实现过程有下面几个步骤:(1)由主界面判断接收到信息的类型,是否为好友发来信息,如果是,则打开聊天窗口(2)读取消息,并写入聊天记录,(3)载入字体颜色信息。
(4) 显示聊天记录C、聊天记录管理模块聊天记录管理模块的实现过程有下面几个步骤:(1)将发送内容和接收内容写入文本文件;(2)显示聊天记录;(3)删除聊天记录。
D、字体颜色模块实现字体颜色模块的过程有下面几个步骤:(1)调用系统字体,获取字体,写入存档(2) 调用系统字体颜色,获取颜色,写入存档(3)读取、更新字体颜色。
基于MFC的聊天程序设计
聊天程序设计报告----网络编程设计报告目录【1】设计原理————————————————————————1 【2】功能描述————————————————————————1 【3】详细设计————————————————————————2 【4】工作进度————————————————————————7 【5】设计总结————————————————————————8 【6】使用方法————————————————————————9 【7】附录——————————————————————————9一. 设计原理计算机网络技术发展至今已经大大超越了人们当初的预想,无论是人们日常的工作还是学习,我们都越来越多的依靠到互联网。
各种实时性的聊天娱乐软件也同时诞生,而且为我们的即时通讯带来了众多的方便,比如说大家所熟知的腾讯QQ、微软的MSN、中国移动的Fetion等,都是做的比较成功的实时聊天工具。
随着网络的日益普及,各种聊天工具也层出不穷,但当我们学习了《网络编程》这门课程之后,我们便会觉得,其实要实现简单的网络通讯其实并不难。
接下来的课程设计就是针对一个简单的网络聊天程序,利用MFC为开发工具,实现基本的通讯功能。
此程序主要分为两个模块:服务线程和聊天线程。
服务线程用于提供一个网络端口,等待客户线程发出请求,登录到作为服务端的程序,然后进行网络通讯和消息的收发;客户端可通过服务器端的IP地址发送连接请求,然后建立连接,进行通讯。
整个程序的主体使用了CSocket类的方法,实现了网络通讯聊天。
二.功能描述(需求分析)1、一对一会话。
此程序既可以作为服务器,也可以作为客户端。
当发起聊天请求时是客户端,而当接受连接请求时时服务器。
通讯基于可靠的TCP连接。
2、修改联系人通讯地址。
可以根据联系人IP地址和端口的不同建立不同的连接。
可以实时修改联系人的地址。
3、多线程技术。
进程启动时会开启一个专门用于监听连接请求的服务进程,线程函数为UINT threadListen(LPVOID lpParam),用来被动接受聊天请求。
基于VC的局域网聊天工具毕业设计论文
基于VC局域网聊天工具的设计与开发教学学院数学与计算机科学学院目录内容摘要: (1)关键词: (1)Abstract: (1)Key words: (2)1. 引言 (2)1.1 MFC简介 (2)1.2 Winsock 介绍 (3)2. 需求分析 (3)2.1 功能需求分析 (3)2.2 性能需求分析 (4)2.3 运行需求分析 (4)3. 系统总体设计 (4)3.1 设计的目标和意义 (5)3.2 系统模块划分 (5)4. 详细设计 (6)4.1 用户注册模块 (6)4.2 用户登录模块 (6)4.4信息显示模块 (7)4.5开启服务器模块 (7)4.6连接服务器模块 (7)5. 编码实现 (8)5.1用户注册模块 (8)5.2 用户登录模块 (12)5.3 注册信息显示模块 (12)5.4 发送信息显示模块 (15)5.5 开启服务器模块 (16)5.6连接服务器模块 (19)6. 总结 (21)参考文献 (22)内容摘要:本毕业设计采用C++作为前端的应用开发工具,Access作为后台的数据库,采用客户端/服务器(C/S)的模型构建,结构健壮灵活,在数据处理、人机界面、数据通信、系统维护等方面具有功能全面、实用等特点。
包括服务器端和客户端两个模块,客户端通过服务器端进行通信。
该软件采用多线程技术支持多用户操作,并采用相关技术进行了优化,加快了文字传递速度。
此次开发是在windows7环境下,使用vs2010作为编程工具和编译环境。
主要采用MFC类进行构造需要的主要界面框架,客户端和服务端主要是基于TCP 协议下的标准通信,能够实现安全快速可靠的信息传输和文件传送功能。
本课题设计出来的局域网聊天工具主要是针对校内用户师生使用,该工具可以通过开始群聊天室来实现师生之间,学生之间的交流沟通,由于采用多线程设计使得了软件可以支持多用户在线聊天,同时,将客户端和服务端集合在一个模块上,使用将更加方便。
网络程序设计课程设计--vc(mfc)实现简单的聊天室程序
网络程序设计课程设计--vc(mfc)实现简单的聊天室程序网络程序设计课程设计--vc(mfc)实现简单的聊天室程序《网络程序设计》课程设计报告书题目:简单的聊天室程序专业:网络工程完成日期:一、题目:简单的聊天室程序要求:本题是一个简单的聊天室程序,采用客户/服务器模式,分为客户端程序和服务器端程序。
由于服务器只能支持一个客户,实际上是一个点对点通信的程序。
客户端程序和服务器程序通过网络交换聊天字符串内容,并在窗口的列表框中显示。
l 。
二、系统概要设计聊天室是分客户端和服务端两个应用程序的,两个应用程序要想实现交互必须编写相应的指令和识别指令的代码,我写的这是个指令依次是启动停止用户退出的命令,但用户想要进行以上动作中的任何一个时,在用户按下按键的时候,客户端都是向服务端发送相应的指令,再由服务端实际的执行。
三、系统详细设计对概要设计中提到的功能函数进行详细设计。
服务器端:// ChatRoomServerDlg.cpp : implementation file // #include “stdafx.h“ #include “ChatRoomServer.h“ #include “ChatRoomServerDlg.h“ #include “ListenSocket.h“ #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: //{{AFX_MSG(CAboutDlg) //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)//{{AFX_MSG_MAP(CAboutDlg) // No message handlers //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CChatRoomServerDlg dialog CChatRoomServerDlg::CChatRoomServerDlg(CWnd* pParent /*=NULL*/) : CDialog(CChatRoomServerDlg::IDD, pParent) { //{{AFX_DATA_INIT(CChatRoomServerDlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CChatRoomServerDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CChatRoomServerDlg)DDX_Control(pDX, IDC_BUTTON_STOP, m_IDC_BUTTON_STOP); DDX_Control(pDX, IDC_BUTTON_START, m_IDC_BUTTON_START); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CChatRoomServerDlg, CDialog) //{{AFX_MSG_MAP(CChatRoomServerDlg)ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON_START, OnButtonStart) ON_BN_CLICKED(IDC_BUTTON_STOP, OnButtonStop) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CChatRoomServerDlg message handlers BOOL CChatRoomServerDlg::OnInitDialog(){ CDialog::OnInitDialog(); // Add “About.“ menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application s main window is not a dialog SetIcon(m_hIcon, TRUE);// Set big icon SetIcon(m_hIcon, FALSE);// Set small icon // TODO: Add extra initialization here m_IDC_BUTTON_STOP.EnableWindow(FALSE); return TRUE; // return TRUE unless you set the focus to a control } void CChatRoomServerDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // If you add a minimize button to your dialog, you will need the code below //to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CChatRoomServerDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect( int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } // The system calls this to obtain the cursor to display while the user drags // the minimized window. HCURSOR CChatRoomServerDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } void CChatRoomServerDlg::OnButtonStart() { // TODO: Add your control notification handler code here m_IDC_BUTTON_START.EnableWindow(FALSE);//使启动按钮无效ListenSocket.Create(6767);//创建监听套接字端口为6767 ListenSocket.Listen();//开始监听m_IDC_BUTTON_STOP.EnableWindow(TRUE);//将停止按钮激活} void CChatRoomServerDlg::OnButtonStop() { // TODO:Add your control notification handler code here m_IDC_BUTTON_STOP.EnableWindow(FALSE);//使停止按钮无效ListenSocket.Close();//关闭监听套接字m_IDC_BUTTON_START.EnableWindow(TRUE);//将启动按钮激活} // ChatRoomServer.h : main header file for the CHATROOMSERVER application // #if !defined(AFX_CHATROOMSERVER_H__680EC642_E19 B_4D55_88DF_2C9E9B1B30FD__INCLUDED_) #define AFX_CHATROOMSERVER_H__680EC642_E19B_4D55_88 DF_2C9E9B1B30FD__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #ifndef __AFXWIN_H__ #error include stdafx.h before including this file for PCH #endif #include “resource.h“// main symbols ///////////////////////////////////////////////////////////////////////////// // CChatRoomServerApp: // See ChatRoomServer.cpp for the implementation of this class // class CChatRoomServerApp : public CWinApp { public: CChatRoomServerApp(); // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CChatRoomServerApp) public: virtual BOOL InitInstance(); //}}AFX_VIRTUAL // Implementation //{{AFX_MSG(CChatRoomServerApp) // NOTE - the ClassWizard will add and remove member functions here. // DONOT EDIT what you see in these blocks of generated code ! //}}AFX_MSG DECLARE_MESSAGE_MAP() }; ///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_CHATROOMSERVER_H__680EC642_E19B _4D55_88DF_2C9E9B1B30FD__INCLUDED_) // ChatRoomServerDlg.h : header file // #if !defined(AFX_CHATROOMSERVERDLG_H__5BE648B6 _8A9C_4E90_BF1D_20FE943A525F__INCLUDED_) #define AFX_CHATROOMSERVERDLG_H__5BE648B6_8A9C_4E9 0_BF1D_20FE943A525F__INCLUDED_ #include “ClientSocketList.h“// Added by ClassView #include “ListenSocket.h“// Added by ClassView #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 ///////////////////////////////////////////////////////////////////////////// // CChatRoomServerDlg dialog class CChatRoomServerDlg : public CDialog { // Construction public: CListenSocket ListenSocket; CChatRoomServerDlg(CWnd* pParent = NULL);// standard constructor // Dialog Data //{{AFX_DATA(CChatRoomServerDlg) enum { IDD =IDD_CHATROOMSERVER_DIALOG }; CButtonm_IDC_BUTTON_STOP;CButtonm_IDC_BUTTON_START; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CChatRoomServerDlg) protected: virtual void DoDataExchange(CDataExchange* pDX);// DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: HICON m_hIcon; // Generated message map functions //{{AFX_MSG(CChatRoomServerDlg) virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); afx_msg void OnButtonStart(); afx_msg void OnButtonStop(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_CHATROOMSERVERDLG_H__5BE648B6_ 8A9C_4E90_BF1D_20FE943A525F__INCLUDED_)#if !defined(AFX_CLIENTSOCKET_H__5B707F31_3AD5_4F 47_B58E_ECFC99EB60F0__INCLUDED_) #define AFX_CLIENTSOCKET_H__5B707F31_3AD5_4F47_B58E_ECFC99EB60F0__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 // ClientSocket.h : header file // ///////////////////////////////////////////////////////////////////////////// // CClientSocket command target class CClientSocketList; class CClientSocket : public CSocket { // Attributes public: // Operations public: CClientSocket(CClientSocketList *); virtual ~CClientSocket(); // Overrides public: CClientSocketList *List; CClientSocket * Front; CClientSocket * Next; // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CClientSocket) public: virtual void OnReceive(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 // Implementation protected: }; ///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_CLIENTSOCKET_H__5B707F31_3AD5_4F4 7_B58E_ECFC99EB60F0__INCLUDED_) //ClientSocketList.h: interface for the CClientSocketList class. // //////////////////////////////////////////////////////////////////////#if !defined(AFX_CLIENTSOCKETLIST_H__E746355D_FA1 0_4D12_B544_2FF152C16414__INCLUDED_) #define AFX_CLIENTSOCKETLIST_H__E746355D_FA10_4D12_B5 44_2FF152C16414__INCLUDED_ #include “ClientSocket.h“ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 class CClientSocketList { public: BOOL Sends(CClientSocket *); BOOL Add(CClientSocket *); CClientSocket * Head; CClientSocketList(); virtual ~CClientSocketList(); }; #endif // !defined(AFX_CLIENTSOCKETLIST_H__E746355D_FA10 _4D12_B544_2FF152C16414__INCLUDED_)#if !defined(AFX_LISTENSOCKET_H__5D655304_370E_468 0_A556_E417552D24EC__INCLUDED_) #define AFX_LISTENSOCKET_H__5D655304_370E_4680_A556_E4 17552D24EC__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 // ListenSocket.h : header file // #include “ClientSocketList.h“ ////////////////////////////////////////////////////////////// /////////////// // CListenSocket command target class CListenSocket : public CSocket { // Attributes public: //Operations public: CClientSocketList CCSL;//客户socket列表CListenSocket(); virtual ~CListenSocket(); // Overrides public: // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CListenSocket) public: virtual void OnAccept(int nErrorCode);//重载OnAccept函数//}}AFX_VIRTUAL // Generated message map functions //{{AFX_MSG(CListenSocket) // NOTE - the ClassWizard will add and remove member functions here. //}}AFX_MSG // Implementation protected: }; ///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_LISTENSOCKET_H__5D655304_370E_4680 _A556_E417552D24EC__INCLUDED_) // ChatRoomServer.cpp : Defines the class behaviors for the application. // #include “stdafx.h“ #include “ChatRoomServer.h“ #include “ChatRoomServerDlg.h” #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CChatRoomServerAppBEGIN_MESSAGE_MAP(CChatRoomServerApp, CWinApp) //{{AFX_MSG_MAP(CChatRoomServerApp) // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code! //}}AFX_MSG ON_COMMAND(ID_HELP, CWinApp::OnHelp) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CChatRoomServerApp construction CChatRoomServerApp::CChatRoomServerApp() { // TODO: add construction code here, // Place all significant initialization in InitInstance } ///////////////////////////////////////////////////////////////////////////// // The one and only CChatRoomServerApp object CChatRoomServerApp theApp; ///////////////////////////////////////////////////////////////////////////// // CChatRoomServerApp initialization BOOL CChatRoomServerApp::InitInstance() { if (!AfxSocketInit()) { AfxMessageBox(IDP_SOCKETS_INIT_FAILED); return FALSE; } AfxEnableControlContainer(); // Standard initialization // If you are not using these features and wish to reduce the size // of your final executable, you should remove from the following // the specific initialization routines you do not need. #ifdef _AFXDLL Enable3dControls();// Call thiswhen using MFC in a shared DLL #else Enable3dControlsStatic();// Call this when linking to MFC statically #endif CChatRoomServerDlg dlg; m_pMainWnd = int nResponse = dlg.DoModal(); if (nResponse == IDOK) { // TODO: Place code here to handle when the dialog is // dismissed with OK } else if (nResponse == IDCANCEL) { // TODO: Place code here to handle when the dialog is // dismissed with Cancel } // Since the dialog has been closed, return FALSE so that we exit the // application, rather than start the application s message pump. return FALSE; } II 客户端:客户端:// ChatRoomClient.cpp : Defines the class behaviors for the application. // #include “stdafx.h“ #include “ChatRoomClient.h“ #include “ChatRoomClientDlg.h“ #include “ConnectedDlg.h“ #include “ClientSocket.h“ #ifdef _DEBUG #d efine new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif CClientSocket curSocket; ///////////////////////////////////////////////////////////////////////////// // CChatRoomClientAppBEGIN_MESSAGE_MAP(CChatRoomClientApp, CWinApp) //{{AFX_MSG_MAP(CChatRoomClientApp) // NOTE - theClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code! //}}AFX_MSG ON_COMMAND(ID_HELP, CWinApp::OnHelp) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CChatRoomClientApp construction CChatRoomClientApp::CChatRoomClientApp。
(VC+MFC网络聊天工具)详细设计
第2章系统分析及开发技术说明2.1节需求分析2。
1.1节功能需求分析图2.1 功能需求说明图(1)用户端的基本聊天信息发送,这些基本聊天信息包括文本和图片。
文本和图片聊天是聊天软件最基础的功能.用户通过输入IP来查找用户,并申请加为好友,在对方同意加为好友后,在线用户列表就会更新用户,把加入的用户添加到用户列表中。
这样,两个用户之前就可以实现通信了。
在信息传输中,预计利用TCP/IP协议中的UDP协议,这是面向无连接的协议,但发送速度快,用于聊天信息传输用适合。
(2)用户端的音视频数据传输,这是本设计的扩展功能。
用户可以正常通信后,就可以选择是否进行语音或视频聊天。
本功能也将采用UDP协议,UDP协议可能会丢失数据,但对于音视频聊天需要传输大量数据但又允许丢失少量数据的情况下,UDP的快速发送信息的特点就得到很好的体现。
(3)用户端文件传输的功能,用户之间可以断点续传文件。
在传文件之前,首先创建一信息文件,记录文件传送的一些信息,并根据传输的数据量实时修改。
如果没有传完,下次就可以继续打开这个信息文件,接着上次的进度传输。
因为文件传输入要求数据不能出错,因此此模块采用TCP协议。
(4)用户端之间白板和共享屏幕的功能,这个功能有些类似视频的传输,因些并不是很难,可以在视频传输的功能上加以修改。
(5)用户之间后台的连接,每个用户隔指定时间会向用户列表中的每一用户发送消息,查看用户是否在线,如果不在线,就更新用户列表,删除用户。
2。
1。
2节数据需求分析(1)客户端之间聊天信息。
在控件上显示时格式化,更易于用户的查看自己发送或接收到的信息。
(2)在线用户列表信息.服务器端存放在适当的空间中,在发送给客户端时,对信息列表进行格式化,便于客户端提取信息。
(3)客户端向服务器端发送的确认在线信息。
包括客户端刚刚启动时的初始化信息和在使用过程中的确认在线信息.(4)其它程序内部可能需要设计的数据结构体.2。
1。
基于VC的网络聊天软件开发论文
基于VC的网络聊天软件开发毕业设计(论文)原创性声明和使用授权说明原创性声明本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。
尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。
对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。
作者签名:日期:指导教师签名:日期:使用授权说明本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。
作者签名:日期:学位论文原创性声明本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。
除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。
对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。
本人完全意识到本声明的法律后果由本人承担。
作者签名:日期:年月日学位论文版权使用授权书本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。
本人授权大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。
涉密论文按学校规定处理。
作者签名:日期:年月日导师签名:日期:年月日注意事项1.设计(论文)的内容包括:1)封面(按教务处制定的标准封面格式制作)2)原创性声明3)中文摘要(300字左右)、关键词4)外文摘要、关键词5)目次页(附件不统一编入)6)论文主体部分:引言(或绪论)、正文、结论7)参考文献8)致谢9)附录(对论文支持必要时)2.论文字数要求:理工类设计(论文)正文字数不少于1万字(不包括图纸、程序清单等),文科类论文正文字数不少于1.2万字。
网络聊天设计
聊天室设计程序实验报告1. 实验目的本实验是基于VisualC++ MFC 进行开发,在整个实验开发的过程中,对MFC的对话窗框架结构的了解,掌握基本的运用MFC编写软件。
对MFC的触发机制、消息映射以及对话框的关联全面的认识和掌握。
增强编程能力,更好的适应个人今后的发展。
2. 功能要求(1)服务器对于所有的客户端进行控制。
(2)客户可以通过服务器转发,实现一对一和一对多聊天。
(3)客户端程序应该可以实时显示目前其它用户的登录状态和在线状态。
(4)能察看聊天纪录。
(5)应该具有易用、美观的图形界面。
3. 运行环境本实验适用于window xp及以上的系统版本,在VIsual C++环境下编译4. 设计方案为实现网络聊天的功能,采用Windows Socket编程,服务器与客户端采用了TCP/IP连接方式,在设计聊天方案时,实行将所有信息发往服务器端,再由服务器进行分别处理的思路,服务器端是所有信息的中心。
服务器及客户端的功能可划分为以下模块:客户端:1)登陆功能:建立与服务器的连接并登陆,能显示登陆错误信息。
2)界面显示:将在线好友显示在好友列表中,并实现系统托盘,加入工具栏便于操作。
3)聊天功能:与好友聊天。
4)聊天纪录:能保存聊天纪录,并能察看聊天纪录。
5)信息提示:能看到用户登陆和退出聊天室的提示及显示时间,。
服务器端:向各个客户端发布系统消息。
接受来自客户端的各种信息并分别处理。
1)登陆信息:检查登陆信息是否正确,并向客户端返回登陆信息,如信息正确。
就将在线用户发给该用户,并将该用户的状态发给各在线用户。
同时在服务器端显示出来。
2)聊天信息:转发给消息指定的用户。
3)用户下线:将此用户下线消息发给各客户端,并改写用户在服务器端的状态。
程序中主要变量及类的功能说明如下:客户端:用户及发送信息结构体类型typedef struct info{ int type; //type=0表示自己,type=1表示在线所有用户,type=2表示指定用户char name[20];char msg[200];};enum { IDD = IDD_CHAT_DIALOG };CListBox m_list1;//在线用户CComboBox m_list;//消息发送到CString m_send;//发送框CString m_read;//消息框CString m_me;//好看初始化:sin.sin_family=AF_INET;sin.sin_addr.s_addr=ulAddress;sin.sin_port=htons(9000);主要函数:CChatDlg::OnCancel() //点击取消按钮,退出void CChatDlg::OnOK() //点击确定按钮,进行聊天send(sockServer,(char*)&sendinfo,sizeof(sendinfo),0)recv(sockServer, (char*)&reinfo, sizeof(reinfo), 0);//从已连接的Socket接收数据,为整形接受不同类型的消息type=1;m_read=m_read+"\r\n"+strTime+"你对大家说:"+m_send;m_send=strTime+m_name+"对大家说:"+m_send;//对方接收type=2;LPCTSTR q=toname;memcpy(,q,toname.GetLength()+1);m_read=m_read+"\r\n"+strTime+"你对"+toname+"说:"+m_send;m_send=strTime+m_name+"对你说:"+m_send;5.设计结果客户端:输入服务器的IP地址进入聊天室或者选择退出进入聊天室开始聊天服务器端监控用户登陆和退出消息,并发送相应消息给用户6. 设计总结:1 程序的应改进之处:1.使用非模态对话框代替模态对话框。
基于MFC的在线聊天系统课程设计
操作系统实验报告一概要设计3.1系统体系结构本系统由教注册、登陆和聊天等部分组成。
注册模块主要完成用户信息的提交,登陆模块用于验证操作者的信息,聊天模块主要包括群聊、私聊,刷新在线用户列表、显示其他用户发送的信息、发送信息给其他用户、上传下载资源等(未实现)。
系统体系结构如下图所示:(注册模块)(登录模块)(聊天模块)3.2系统的设计与实现3.2.1数据库设计本系统主要采用以下数据库表:个人信息表个人信息表主要存储用户的一些基本注册信息,其中包括用户名和密码字段,主要用于用户系统对用户的识别。
具体内容见表1:表1 个人信息表3.2.2模块实现3.2.2.1注册模块的实现✧注册用户首次使用该系统应该先完成注册。
按照系统提示的步骤,逐步完成注册后即可登录该系统,使用该系统。
3.2.2.2登陆模块的实现✧登录用户凭借已经注册的用户名和密码登陆该系统。
3.2.2.3聊天模块的实现✧群聊\ 私聊用户点击界面上的群聊或私聊按钮即可和他人进行聊天。
✧听音乐用户点击听音乐的按钮,可打开音乐软件进行听音乐。
✧刷新在线用户列表和显示别人发来的信息当有人登陆是可以自动刷新登陆列表,当有人发送信息时,会显示信息。
✧上传下载(暂未实现)用户可以点击上传或下载按钮,把电脑资源上传或从服务器下载资源,而且用户可点击修改按钮,实现上传信息的修改。
二详细设计4.1用户进行通信用户按照界面提示进行交流,通过MFC的SOCKET编程实现客户端与服务器的数据传输,下面通过流程图和主要代码段详细说明设计过程:(通信流程图)因此只要安装了客户端,连接了客户端后即可与其他人进行通信。
实现客户端主要:下面一段代码是对套接字的初始化:CLoginDlg dlg;int nRet = -1;nRet = dlg.DoModal();//此成员函数用来显示一个模态对话框。
其返回值对应于用来关闭对话框的控件的ID。
switch(nRet){case IDOK:m_pMySocket = new CMySocket(this);if(!m_pMySocket->Create())//创建套接字{delete m_pMySocket;m_pMySocket = NULL;AfxMessageBox("创建套接字失败!");return;}if(!m_pMySocket->Connect(dlg.m_strIP, dlg.m_nPort))//连接服务器{delete m_pMySocket;m_pMySocket = NULL;AfxMessageBox("连接服务器失败!");return;}m_sUsername = dlg.m_strUserName;// 连接成功后发送登录消息Packet packet;memset(&packet, 0, sizeof(Packet));//清零packet.type = LOGIN_REQUEST;strcpy(ername, dlg.m_strUserName);strcpy(packet.password, dlg.m_strPassword);m_myname=dlg.m_strUserName;UpdateData(false);m_pMySocket->Send(&packet, sizeof(Packet));//send 功能向窗口发送指定的消息并立即执行相应的事件处理程序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第2章 系统分析及开发技术说明2.1节 需求分析2.1.1节 功能需求分析图2.1 功能需求说明图(1)用户端的基本聊天信息发送,这些基本聊天信息包括文本和图片。
文本和图片聊天是聊天软件最基础的功能。
用户通过输入IP 来查找用户,并申请加为好友,在对方同意加为好友后,在线用户列表就会更新用户,把加入的用户添加到用户列表中。
这样,两个用户之前就可以实现通信了。
在信息传输中,预计利用TCP/IP 协议中的UDP 协议,这是面向无连接的协议,但发送速度快,用于聊天信息传输用适合。
(2)用户端的音视频数据传输,这是本设计的扩展功能。
用户可以正常通信后,就可以选择是否进行语音或视频聊天。
本功能也将采用UDP 协议,UDP 协议可能会丢失数据,但对于音视频聊天需要传输大量数据但又允许丢失少量数据的情况下,UDP 的快速发送信息的特点就得到很好的体现。
(3)用户端文件传输的功能,用户之间可以断点续传文件。
在传文件之前,首先创建一信息文件,记录文件传送的一些信息,并根据传输的数据量实时修改。
如果功能需求 发送基本聊天信息 传输音视频数据 传输文件 白板 共享屏幕 保持连接发送文本信息 发送图片信息没有传完,下次就可以继续打开这个信息文件,接着上次的进度传输。
因为文件传输入要求数据不能出错,因此此模块采用TCP协议。
(4)用户端之间白板和共享屏幕的功能,这个功能有些类似视频的传输,因些并不是很难,可以在视频传输的功能上加以修改。
(5)用户之间后台的连接,每个用户隔指定时间会向用户列表中的每一用户发送消息,查看用户是否在线,如果不在线,就更新用户列表,删除用户。
2.1.2节数据需求分析(1)客户端之间聊天信息。
在控件上显示时格式化,更易于用户的查看自己发送或接收到的信息。
(2)在线用户列表信息。
服务器端存放在适当的空间中,在发送给客户端时,对信息列表进行格式化,便于客户端提取信息。
(3)客户端向服务器端发送的确认在线信息。
包括客户端刚刚启动时的初始化信息和在使用过程中的确认在线信息。
(4)其它程序内部可能需要设计的数据结构体。
2.1.3节性能需求分析(1)可靠性高,能在由于系统问题或其它原因产生错误后,作出相对应处理,比如网络初始化失败、服务器不在线等,可以提示用户安全退出本程序,在出现不可知的错误以后,可以尽量安全的退出程序。
在程序的设计过程中,要求能尽可能多的设想到用户使用过程中可能发生的事件,并能在判断事件后做出相应的处理,使程序具有较高的容错性能。
(2)宜操作性,程序简单易懂,容易上手使用。
设计界面是,简化界面的复杂性,模拟QQ等现有即时通讯工具的界面,使用户能很容易看懂并使用。
(3)开发文档易理解,保证以后自己二次开发或他人接手开发时,能够清晰的理解整个系统的设计思路和实现细节。
(4)模块化设计此软件的功能,不同的模块实现不同的功能,使得软件易于以后的维护与扩展,在以后可以更好的完善本软件的功能,更方便于在工作中的应用。
2.1.4节运行需求分析(1)用户界面程序较小,启动速度快,无启动界面。
在本地局域网中使用,所以无需进行用户登录,无需认证界面,启动后的应用界面要清爽,设计要简单明了,要具有较高的易用性。
(2)故障处理在遇到可预知的故障与情况时,能提示用户并自动退出;在遇到不可预知的故障时能安全退出。
2.4节Winsock网络编程Windows Sockets是从Berkeley Sockets扩展而来的,其在继承Berkeley Sockets 的基础上,又进行了新的扩充。
这些扩充主要是提供了一些异步函数,并增加了符合WINDOWS消息驱动特性的网络事件异步选择机制[5]。
Windows Sockets由两部分组成:开发组件和运行组件。
开发组件:Windows Sockets 实现文档、应用程序接口(API)引入库和一些头文件。
运行组件:Windows Sockets 应用程序接口的动态链接库(WINSOCK.DLL)。
2.4.1节Socket套接字(Socket)最初是由加利福尼亚大学Berkeley分校为UNIX操作系统开发的网络通信接口,随着UNIX操作系统的广泛使用,套接字成为当前最流行的网络通信应用程序接口之一[7]。
90年代初,由Sun Microsystems,JSB Corporation,FTP software,Microdyne和Microsoft等几家公司共同制定了一套标准,即Windows Sockets 规范。
Windows Sockets API是Microsoft Windows的网络程序设计接口,它在继承了Berkeley Sockets主要特征的基础上,又对它进行了重要扩充。
这些扩充主要是提供了一些异步函数,并增加了符合Windows消息驱动特性的网络事件异步选择机制。
这些扩充有利于应用程序开发者编制符合Windows编程模式的软件,它使在Windows下开发高性能的网络通信程序成为可能。
Socket实际上是指一个通信端点,借助于它,用户所开发的Socket应用程序,可以通过网络与其它Socket应用程序进行通信。
近年来,随着计算机网络与Windows 95的流行,许多用户所开发的应用程序需要实现网络间的数据通信。
2.4.2节开发Windows Sockets网络通信程序的软、硬件环境所采用的操作系统软件可以是Windows 95,2000,XP,也可以是Windows NT,因为它们都支持Windows Sockets API,在以下的介绍中,我们将以在Windows XP环境下的开发为例。
所采用的编程语言一般可选目前较流行使用的可视化和采用面向对象技术的Microsoft Visual C++ 6.0。
Visual C++ 6.0可在Windows XP或Windows NT环境下运行,其开发系统增加了全面集成的基于Windows 的开发工具以及一个基于传统C/C++开发过程的“可视化”用户界面驱动模型。
Visual C++ 6.0中的Microsoft基类(MFC,即Microsoft Foundation Class)库是一系列C++类,其中封装着为Microsoft Windows 操作系统系列编写应用程序的各种功能。
在有关套接字方面,Visual C++ 6.0对原来的Windows Sockets库函数进行了一系列封装,继而产生了CSocket 、CSocketFile等类,它们封装着有关Socket的各种功能[8]。
所采用的网络通信协议一般是TCP / IP。
Windows XP和Windows NT都带有该协议。
但是,所开发的网络通信应用程序并不能直接与TCP / IP核心打交道,而是与网络应用编程界面Windows Sockets API打交道。
Windows Sockets API则可直接与TCP/IP核心进行沟通。
TCP / IP核心协议连同网络物理介质(如网卡)一起,都是提供网络应用程序间相互通信的设施。
2.4.3节CSocket类编程模型使用CSocket对象涉及CArchive和CSocketFile 类对象。
以下介绍的针对字节流型套接字的操作步骤中,只有第三步对于客户方和服务方操作是不同的,其他步骤都相同[13]。
(1)构造一个CSocket对象。
(2)使用这个对象的Create()成员函数产生一个socket对象。
在客户方程序中,除非需要数据报套接字,Create()函数一般情况下应该使用默认参数。
而对于服务方程序,必须在调用Create时指定一个端口。
需要注意的是,Carchive类对象不能与数据报(UDP)套接字一起工作,因此对于数据报套接字,CAsyncSocket和CSocket 的使用方法是一样的。
(3)如果是客户方套接字,则调用CAsyncSocket ∷Connect()函数与服务方套接字连接;如果是服务方套接字,则调用CAsyncSocket∷Listen()开始监听来自客户方的连接请求,收到连接请求后,调用CAsyncSocket∷Accept()函数接受请求,建立连接。
请注意Accept()成员函数需要一个新的并且为空的CSocket对象作为它的参数,解释同上。
(4)产生一个CSocketFile对象,并把它与CSocket 对象关联起来。
(5)为接收和发送数据各产生一个CArchive 对象,把它们与CSocketFile对象关联起来。
切记CArchive是不能和数据报套接字一起工作的。
(6)使用CArchive对象的Read()、Write()等函数在客户与服务方传送数据。
(7)通讯完毕后,销毁CArchive、CSocketFile和CSocket对象。
2.4.4节用VC6.0进行Windows Sockets程序开发的技术要点(1)同常规编程一样,无论服务器方还是客户方应用程序都要进行所谓的初始化处理,这部分工作仍可采用消息驱动机制来先期完成。
(2)一般情况下,网络通信程序是某应用程序中的一模块。
在单独调试网络通信程序时,要尽量与采用该通信模块的其它应用程序开发者约定好,统一采用一种界面形式,即单文档界面SDI、多文档界面MDI和基于对话框界面中的一种(这在使用AppWizard形成项目[Project]文件时有提示),尽管这并非必须,但可使通信模块在移植到所需的应用程序时省时省力,因为Visual C++ 6.0这种可视化语言在给我们提供方便的同时,也给我们带来某些不便,譬如所形成的项目文件中的许多相关文件与所采用的界面形式密切联系,许多消息驱动功能,随所采用的界面形式不同而各异。
当然,也可将通信模块函数化,并形成一个动态连接库文件(DLL文件),供主程序调用。
(3)以通信程序作为其中一个模块的应用程序往往不是在等待数据发送或接收完之后再做其它工作,因而在主程序中要采用多线程(Multithreaded)技术。
即将数据的发或收,放在一个具有一定优先级(一般宜取较高优先级)的辅助线程中,在数据发或收期间,主程序仍可进行其它工作,譬如利用上一个周期收到的数据绘制曲线。
Visual C++ 6.0中的MFC提供了许多有关启动线程、管理线程、同步化线程、终止线程等功能函数[14]。
(4)在许多情况下,要求通信模块应实时地收、发数据。
譬如调用之的主程序以0.5秒为一周期,在这段时间内,要进行如下工作:接收数据,利用收到的数据进行运算,将运算结果发送到其它计算机节点,周而复始。
我们在充分利用Windows Sockets的基于消息的网络事件异步选择机制,用消息来驱动数据的发送和接收的基础上,结合使用其他措施,如将数据的收和发放在高优先级线程,在软件设计上,安排好时序,尽量避免在同一时间内,双方都在向对方发送大量数据的情况发生,保证网络要有足够的带宽等,成功地实现了数据传输的实时性[2]。