VC++网络聊天系统摘 要 在计算机技术高速发展的今天,实现人与人之间的即时交流已不是困难的事情。例如电话,发送Email等。这些都很方便,但在特定的情况下--比如只是在公司内部交流,这时成本、信息的即时和实现信息的再交流上达不到最适的平衡。在追求高效率的同时,并以低廉的成本实现局部范围内的信息及时准确的交流,聊天室便成了最好的选择之一。该局域网聊天室建立在局部网络中,只要是连入局域网络的计算机都可以方便的给使用者发送消息,并且占用很少的系统资源。在设计上,该局域网聊天系统运用软件工程的设计流程,综合运用了Windows程序设计技术、网络通讯技术、ADO数据库编程技术,以Visual C++6.0作为前台运用程序开发工具,进行软件开发。此聊天工具采用客户端/服务器端(C/S)模式,客户端采用TCP与服务器连接,客户端与客户端之间通过TCP相互通讯。服务器端有管理员登陆、管理页面组成。客户端有注册、登陆 、设置IP、用户主界面、聊天室等界面组成。本系统是根据实际的需求而设计,通过对计算机硬件和软件解决方案的论证,对实际应用领域进行深入的调查分析,已经基本上成功地实现了设计要求。关键字网络通讯; 客户端/服务器模型; 传输控制协议; 用户数据报协议; 微软基础类; 套接字ABSTRACT
In the rapid development of computer technology today to achieve the immediate exchange between people is not difficult. Such as telephone, such as Email sent. These are very convenient, but in certain circumstances - for example only in-house exchange, then the cost, real-time information and the further exchange of information on up to less than optimal balance. In the pursuit of high efficiency, low cost and to achieve within the scope of local timely and accurate exchange of information, chat rooms, has become one of the best choice. The LAN chat rooms in the establishment of local networks, as long as it is connected to the LAN the computer can easily send messages to users, and occupation of the very few system resources. The design of the LAN systems use chat software engineering design process, the integrated use of the Windows programming technology, network communications technology, ADO database programming technology to Visual C + +6.0 future use as a tool for the development of procedures for software development. This chat tool use client / server (C / S) model, the client and server using TCP connection, the client and client communication between each other through TCP. Server administrator landing, the management of pages. Client registered, landing, set IP, the main user interface, chat rooms, and other interface components. The system is based on the actual needs of design, through the computer hardware and software solutions for the demonstration, the practical application of the field to conduct in-depth investigation and analysis has been largely successful in achieving the design requirements.Key wordsNetwork communications;client / server model;transmission control protocol; user data on the agreement; Microsoft basis; socket195
网络聊天系统目 录摘 要 1关键字 1ABSTRACT 2KEY WORDS 2目 录 31绪 论 11.1 选题的背景 11.2 选题的目的和意义 11.3 可行性分析 21.3.1 技术可行性 21.3.2 管理可行性 21.3.3 经济可行性 21.3.4 运行可行性 22系统开发环境和主要技术简介 32.1 VISUAL C++概述 32.1.1 Visual C++的简介 32.1.2 Visual C++的发展过程 32.1.3 Visual C++的特点 32.1.4 MFC和Visual C++ 42.2 ADO 42.2.1 ADO基本常识 42.2.2 ADO接口的工作原理 42.3 MFC SOCKET编程 52.3.1 MFC Socket编程机制 52.3.2 CSocket类编程模型 63系统总体设计 73.1 需求分析 73.2 功能概述 73.3 运行环境 73.4 系统总体方案设计 83.5数据字典 83.5.1.user_info -----用户基本信息表 83.5.2 manager-----管理员信息 94 系统详细设计 104.1服务器详细设计 104.1.1服务器结构设计 104.1.2服务器实现原理及功能描述 104.1.3 类设计 104.1.4 服务器界面设计及主要实现代码 104 .2客户端详细设计 194.2.1客户端结构设计 194.2.2客户端实现原理及功能描述 204.2.3 客户端界面设计及主要实现代码 215系统测试 315.1聊天系统的总体设计目标服务器端的总体设计目标: 315.2客户端的总体设计目标: 325.3测试结果 326设计心得 336.1 需求分析与系统设计阶段心得 336.2 测试阶段心得 336.3统实施和维护阶段心得 33结束语 34致 谢 34参考文献 195
网络聊天系统源代码1绪 论展望新世纪,市场全球化的浪潮势不可挡,WTO已经向我们走来,企业间的竞争变得更加激烈。如何面对这样激烈的竞争,是摆在我国企业面前的最紧迫的问题。信息在竞争中已经越来占有成分,可以说最后的制胜关键就是信息的即时性,在企业内部实现信息交流的即时性也就变的非常重要。
1.1 选题的背景 随着网络的普及化,网络作为人们相互沟通与交流联系的现代化工具日益重要,可以说现在的人们的生活已经离不开网络。在现在生活中人们虽然可以通过很多手段进行联系,但是对于一些具体的情况这些手段已经满足不了高效低成本的要求。于是针对满足局域范围内实现即时交流我们选择了局域网聊天室。随着网络技术和数据库管理系统的发展,C/S体系结构在软件的开发中越来越受到人们的认可。因为这种结构的应用软件充分的发挥了网络的作用和数据库的优势。同时,Microsoft公司的Visual C++编程开发环境,已经成为各国程序员开发系统和应用程序的首选工具。这是由于它有功能强大,支持面向对象,模块化和代码可以重写等特点,可以大大提高软件和系统的效率。网络的飞速发展使得网络应用程序开发显的越来越重要,但是网络应用程序开发和传统的开发思想和实现上有很大区别。Microsoft公司的Visual C++编程开发环境在进行网络应用程序开发方面有以下几个特点:开发出的应用程序占有资源少、开发人员有灵活多变的开发方式、如果使用VC的MFC类库则可以使用开发人员从很大程度上简化开发过程、可使用应用程序有很强的扩展性。基于网络编程的日益流行和重要,以及Visual C++对网络编程所提供的全面技术支持,我决定采用Visual C++作为我毕业设计网络聊天工具的前端开发环境。而后端数据库采用Microsoft公司的Access 2003.
1.2 选题的目的和意义 随着网络的飞速发展,为了适应网络的发展和充分的利用网络的价值,一种基于网络的通信工具就被开发出来——聊天室系统。它是一个即时通信软件,以方便公司内部员工和亲朋好友之间的通信联系,并且大大的降低了因人们联系所花费的费用。1.3 可行性分析可行性分析(Feasibility Analysis)也称为可行性研究,是在系统调查的基础上,针对新系统的开发是否具备必要性和可能性,对新系统的开发从技术、经济、社会的方面进行分析和研究,以避免投资失误,保证新系统的开发成功。可行性研究的目的就是用最小的代价在尽可能短的时间内确定问题是否能够解决。该系统的可行性分析包括以下几个方面的内容。1.3.1 技术可行性技术上的可行性分析主要分析技术条件能否顺利完成开发工作,硬、软件能否满足开发者的需要等。该系统采用了当前流行的C、C++和MFC等语言进行开发,借助Visual C++搭建框架,因此,系统的软件开发平台已成熟可行。硬件方面,科技飞速发展的今天,硬件更新的速度越来越快,容量越来越大,可靠性越来越高,价格越来越低,其硬件平台完全能满足此系统的需要。1.3.2 管理可行性主要除了一些老年人和小孩子,基本上都可以正确的操作,而且该应用程序只要你能够打字,其他的操作都是非常简单。不过所有操作都是基于电脑上。 1.3.3 经济可行性主要是对项目的经济效益进行评价,本系统开发经费相对较少,在经济上是可以接受的,并且本系统实施后可以改变人们的联系方式,有助于更多的人去了解电脑,使得电脑全国化。现在,计算机的价格已经十分低廉,性能却有了长足的进步,普及率越来越高,参与的人也将越来越多,系统的市场潜力巨大,主要表现有以下几个方面:第一,现在能操作电脑的都会是用过聊天工具的用户;第二,网络在国内的普及力越来越高;第三,现在电脑越来越普及,直接促使硬件上成熟第四,系统投入少,回报快等等。所以,本系统在经济上是可行的。1.3.4 运行可行性本系统经过精心设计开发,比较紧凑,项目比较小,所以对软硬的要求并不高,运行投入也相对较少,现在普通的电脑都能够满足条件,因此,本系统在运行上是可行的。系统运行环境:为了保证系统运行的效率和可靠性,对软硬件配置有一定要求。此应用程序运行要求如下:(1)软件环境:操作系统:Windows2000/XP,Internet Explorer(IE),Internet Information Server (IIS)4.0及其以上版本;或者Windows98,Personal Web Server(PWS),IE等。数据库:采用Access (2)硬件环境: PU: PII 以上,内存:128M以上 2系统开发环境和主要技术简介2.1 Visual C++概述2.1.1 Visual C++的简介 VC基于C,C++语言,主要由是MFC组成,是与系统联系非常紧密的编程工具,它兼有高级,和低级语言的双重性,功能强大,灵活,执行效率高,几乎可说VC在 Windows平台无所不能
2.1.2 Visual C++的发展过程 从20世纪70年代第一次提出面向对象的概念开始,到现在面向对象技术发展成为一种比较成熟的编程思想,通过面向对象技术,可以将现实世界直接影射到对象空间,从而为系统的设计和开发带来革命性的影响。Visual C++是一个典型的面向对象程序的设计语言,它也是目前为止功能最强、最受欢迎、应用最广泛、高效的Windows应用程序开发工具,它是在C 语言基础之上发展起来的,是C语言的超集。
2.1.3 Visual C++的特点Visual C++是功能最为强大可视化开发工具,它不仅支持传统的软件开发方法,更重要的是它能支持面向对象、可视化的开发风格。因此Visual C++又称作是一个集成开发工具,它提供了软件代码自动生成和可视化的资源编辑功能。 Visual C++具有的优点:提供了面向对象的应用程序框架MFC(Microsoft Foundation Class),简化了程序员的编程工作,提高了模块的可重用性;提供了基于CASE技术的可视化软件的自动生成和维护工具AppWizard、ClassWizard、Visual Studio、WizardBar等,实现了直观、可视的程序设计风格,方便地编和管理各种类,维护程序的源代码;封装了Windows的API函数、USER、KERNEL、GDI函数,简化了编程时创建、维护窗口的许多复杂的工作。2.1.4 MFC和Visual C++ MFC是微软基础类库的简称,是微软公司实现的一个c++类库,主要封装了大部分的windows API函数,vc++是微软公司开发的c/c++的集成开发环境,所谓集成开发环境,就是说利用它你可以编辑,编译,调试,而不是使用多种工具轮换操作,灵活性较大。有时人们说vc呢也指它的内部编译器,集成开发环境必须有一个编译器内核,要不有什么用,例如DevC++其中一个编译器内核就是gcc。 MFC除了是一个类库以外,还是一个框架,你应该试过,在vc++里新建一个MFC的工程,开发环境会自动帮你产生许多文件,同时它使用了mfcxx.dll。xx是版本,它封装了mfc内核,所以你在你的代码看不到原本的SDK编程中的消息循环等等东西,因为MFC框架帮你封装好了,这样你就可以专心的考虑你程序的逻辑,而不是这些每次编程都要重复的东西,2.2 ADO2.2.1 ADO基本常识 ADO(ActiveX Data Object)是Microsoft数据库应用程序开发的新接口,是建立在OLE DB之上的高层数据库访问技术,提供了简单易用的访问各种数据资源(包括关系型和非关系型)。是相对比较新的数据库访问技术。2.2.2 ADO接口的工作原理 ADO连接数据库应用程序需要进行以下步骤:(1) 初始化COM库,利用预编译#import引入ADO库定义文件#import "D:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","EndOfFile") rename("BOF","FirstOfFile")#include "icrsint.h"
网络聊天系统源代码在应用程序的初始化函数中对COM库进行初始化。以下两种方法都可以,但是初始化是必须的,一定要记得加。BOOL CAdoTestApp::InitInstance(){ // 方法1 ::CoInitialize(NULL);/* 方法2if(!AfxOleInit()) { AfxMessageBox("COM Error!"); return FALSE; }*/…..}(2)用Connection对象连接数据库 _ConnectionPtr m_pConnection; m_pConnection.CreateInstance(_uuidof(Connection)); m_ pConnection ->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source = D:\\Documents and Settings\\y\\My Documents\\student.mdb;","","",-1);其中_ConnectionPtr是一个接口,类似于ODBC中的CDatabase类,首先创建一个该接口,接着打开某个指定的数据源。也即是完成数据库的连接。跟_RecordsetPtr,_CommandPtr接口一起来执行任务。因使用方便,也有人把它跟叫做智能指针。(3)利用建立好的连接,通过Connection、Command对象执行SQL命令,或利用Recordset对象取得结果记录集进行查询、处理。(4)使用完毕后关闭连接释放对象。
2.3 MFC Socket编程 2.3.1 MFC Socket编程机制 :
服务器端 客户端创建套接字s1=socket(…)将本地地址与s1相连接bind(s1,…)监听来自客户方的连接listen(s1,…)接受连接,并且得到新的套接字s2s2=accept(s1,…) 建立连接 建立套接字s=socket(…)将套接字和服务器端主机连接connect(s,…)在套接字s2上读写数据,直到数据交换完recv(s2,…) send(s2,…)关闭套接字s2 colsesocket(s2)关闭套接字s1 closesocket(s1) 传输数据 在套接字上读写数据,直到数据交换完。Send(s1….)recv(s1,…)关闭套接字s closesocket().
2.3.2 CSocket类编程模型
CSockect的继承关系:
MFC对CSockect的封装采用如下步骤:
服务器 客户端//构造一个CSockect对象sockectCSockect sockSrvr; //构造一个CSockect对象sockectCSockect sockClient;//生成sockectsockSrvr.Create(nPort); //生成sockectsockClient.Create();//进行监听sockSrvr.Listen(); //实现链接sockClient.Connect(strAddr,nPort)//构造新的sockectsockSrvr.Accept(sockRecv); //构造文件对象CSockFile file(&sockRecv); //构造文件对象CSockFile file(&sockClient);//构造CArchive对象CArchive.arIn(&file, CArchive::load) //构造CArchive对象CArchive.arIn(&file, CArchive::load)//使用CArchive传送数据arIn>>dwValue; //使用CArchive传送数据arIn>>dwValue;3系统总体设计 3.1 需求分析 “沟通无极限”,这句移动通讯的广告语其实更适合即时聊天。即时聊天使亲友的沟通突破时空极限,使办公室的沟通突破上下级极限,使陌生人的沟通突破环境极限,使自我与外界的沟通突破心理极限……作为使用频率最高的网络软件,即时聊天已经突破了作为技术工具的极限,被认为是现代交流方式的象征,并构建起一种新的社会关系。它是迄今为止对人类社会生活改变最为深刻的一种网络新形态,没有极限的沟通将带来没有极限的生活。互联网诞生于传统的电话网络,通讯交流可以说是互联网天然的应用之一。电子邮件就是最重要的通讯交流工具,是互联网最早的“杀手级应用”。此后兴起的网络论坛和网络聊天室都是网络聊天的前身。虽电子邮件有不可以取代的因素,但即时聊天系统更加适合局域范围内,更能及时有效的传递信息。3.2 功能概述 1).可以多人同时以文字的方式在线聊天;2).客户进入本系统必须注册,系统要保存每一个注册的帐号和口令。3).聊天室内的聊天信息对于本室的所有客户可见,同时也可以设置私聊,信息只有交谈双方知道4).退出系统时,用户名从在线用户列表中删除,并同时在各终端中显现。5).系统对用户可以管理(删除,修改权限)。3.3 运行环境a. 系统软件:Windows NT;Windows XP;b. 编译软件:Visual C++6.0;c. 数据库:Access3.4 系统总体方案设计 图 系统总体方案设计(Graph 4-1-1 Overall System Design)
网络聊天系统源代码3.5数据字典3.5.1.user_info -----用户基本信息表
表名 user_info列名 数据类型(精度范围) 空/非空 约束条件用户名 文本 非空 密码 文本 非空 安全问题 文本 安全问题答案 文本 3.5.2 manager-----管理员信息
表名 manager列名 数据类型(精度范围) 空/非空 约束条件用户名 文本 非空 密码 文本 非空 补充说明 仅用来保存服务器端管理员信息,只能直接在数据库中添加 4 系统详细设计 4.1服务器详细设计4.1.1服务器结构设计
图 4-1-1 服务器结构 (Graph 4-1-1 Server Architecture)
4.1.2服务器实现原理及功能描述 可以同时和多个客户端相连,并能和每个客户端之间进行数据的传输;可以显示所有的用户所发送的消息并将其显示出来;能接收客户端发来的信息,而且还要根据客户机的状态及时发布一些信息;将接收的某一客户机的信息,发送给所有其他客户端程序,实现聊天室的信息同步4.1.3 类设计 CaboutDlg、CChatSysServerApp、CChatSysServerDlg、CManagePage、CP2PData、CRoomInfo、CUserDlg、CUserSocket
4.1.4 服务器界面设计及主要实现代码
登陆界面
登陆流程图 图 4-1-4服务器管理员登陆 (Graph 4-1-4 Server Administrator Landing)
主要实现原理: 通过核对存放于数据库的用户信息来确认是不是合法用户,从而达到安全性
实现代码:BOOL CChatSysServerDlg::OnInitDialog(){ // 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_pConnection.CreateInstance(_uuidof(Connection)); m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=chatsystem.mdb;","","", -1); //打开记录集 m_pRecordset.CreateInstance(_uuidof(Recordset)); m_pRecordset->Open("select * from manager",m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
// GetDlgItem(IDC_USNAME)->SetFocus(); m_MgName = "cs001"; m_MgPasswd = "123456"; UpdateData(FALSE); return TRUE; // return TRUE unless you set the focus to a control}
// The system calls this to obtain the cursor to display while the user drags// the minimized window.HCURSOR CChatSysServerDlg::OnQueryDragIcon(){lwfree.cn}//登陆判断函数void CChatSysServerDlg::OnLogin() { // TODO: Add your control notification handler code here UpdateData(TRUE); //判断用户名和密码是否为空 if (m_MgName == "" ||m_MgPasswd =="") { MessageBox("用户名或者密码不能为空!", "提示", MB_ICONWARNING |MB_OK); GetDlgItem(IDC_USNAME)->SetFocus(); return; } //移动第一条记录 m_pRecordset->MoveFirst();
VC++网络聊天系统while (!m_pRecordset->EndOfFile) { //读用户名 vFieldValue = m_pRecordset->GetCollect("用户名"); strFieldValue = (char*)_bstr_t(vFieldValue); //判断用户名是否正确 if (strcmp(strFieldValue, m_MgName) == 0) { //读密码,判断密码是否正确,如果正确则显示管理页面 vFieldValue = m_pRecordset->GetCollect("密码"); strFieldValue = (char*)_bstr_t(vFieldValue); if (strcmp(strFieldValue, m_MgPasswd) == 0) { CManagePage dlg; OnCancel(); dlg.DoModal(); break; } //否则提示错误 else { MessageBox("密码错误!", "提示", MB_ICONWARNING |MB_OK); m_MgPasswd = ""; GetDlgItem(IDC_PASSWD)->SetFocus(); return; } } m_pRecordset->MoveNext(); } }
查看用户界面实现代码:UINT RecvThread(LPVOID sock){ BOOL IsRun = TRUE; SOCKET mySocket; mySocket = (SOCKET)sock;
POSITION pos; POSITION pos2; CP2PData temp; CUserSocket usersocket; CUserSocket tempsock; CRoomInfo roominfo; int listcount;
while(IsRun) { int n_recv; char RecvBuffer[1024]; //接收用户消息 n_recv = ::recv(mySocket, RecvBuffer, sizeof(RecvBuffer), 0); if (n_recv > 0) { //分割消息,取出标志位 RecvBuffer[n_recv] = '\0'; int i = 0; char flag[20]; char *pbuffer = RecvBuffer; while(*pbuffer != '\0') { if(*pbuffer == '~') break; flag[i] = *pbuffer; i++, pbuffer++; } flag[i] = '\0'; pbuffer++; //用户退出消息处理 if (strcmp(flag, "USER_QUIT") == 0) { //查找用户结点 pos = SocketList.GetHeadPosition(); listcount = SocketList.GetCount(); for(int j=0; j