不为失败找借口,只为成功找方法!
分类: WINDOWS
2011-11-15 22:33:54
第一部分 绪论
1.1课题的来源及意义
近年来随着PC的广泛应用和网络的不断发展,目前网络技术已经成为了计算机领域内的最热门的发展方向。当前是数字信息时代,网络时代,任何一种编辑工具都不能忽视在网络上的应用,并且随着Internet 的普及和宽带技术的成熟,越来越多的用户进入网络世界中享用浏览新闻、查询信息、发送邮件、在线观看电影等服务,享受网络带来的便利和办公的高效,与此同时一个新型的Web应用程序为网民之间提供了一个实时通信的功能和场所,这就是聊天室。
在网络早期就开始盛行,不论是BBS,IRC 都有类似网上聊天室的机制。聊天室为网友提供了实时性对话的渠道,是网络上极为流行的一项服务,极大程度上方便了处于世界各地的友人之间的相互联系,也使世界好像一下子缩小了,不管你在哪里,只要你上了网,打开这些软件,就可以给你的朋友发信息,不管对方是否同时也在线,只要知道他的号码。
聊天室适用于网上会议或闲聊的一些场合。聊天室为网友提供了较好的交友环境,网友之间相互以文字交谈,在形式上有点类似笔友的性质,却大大节省了书信往返的时间,这也是网上交友之所以如此热门的原因。
1.2课题设计的目的和要求
1、综合运用本课程及计算机网络的相关知识设计并实现一个网络应用程序,以Visual C++6.0作为开发平台,通过实践复习巩固课堂所学的理论知识,提高对所学知识的综合应用能力,进一步加强winsock编程技术。
2、采用客户/服务器模式,分为客户端程序和服务器程序。服务器采用WINSOCK I/O模型中的任一种,支持多个客户同时在线聊天。客户端程序和服务器程序通过网络交换聊天字符串内容,服务器窗口的列表框中显示当前在线用户,支持客户端之间的私聊(可以通过服务器中转)。
1.3 时间安排
★选择课题 1天
★总体设计和详细设计 8天
★源代码 3天
★调试与测试 2天
★书写实验报告 1天
第二部分 系统开发环境与关键技术
2.1 系统开发环境
◆操作系统:WINDOWS XP
◆开发平台:Microsoft Visual C++6.0、Microsoft Visio 2003、
MSDN
◆开发语言:C++
2.2 关键技术
2.2.1 Visual C++和面向对象程序设计
VC基于C,C++语言,主要由MFC组成,是与系统联系非常紧密的编程工具,它兼有高级和低级语言的双重性,功能强大,灵活,执行效率高,几乎可以说VC在Windows平台无所不能。Visual C++是一个典型的面向对象程序设计语言,它也是目前为止功能最强、最受欢迎、应用最广泛、高效的Windows应用程序开发工具,它是在C语言基础上发展起来的,是C语言的超集。
Visual C++是功能最为强大可视化开发工具,它不仅支持传统的软件开发方法,更重要的是它能支持面向对象、可视化的开发风格。因此Visual C++又称作是一个集成开发工具,它提供了软件代码自动生成和可视化的资源编辑功能。Visual C++具有的优点:提供了面向对象的应用程序框架MFC(Microsoft Foundation Class),简化了程序员的编程工作,提高了模块的可重用性;提供了基于CASE技术的可视化软件的自动生成和维护工具AppWizard、ClassWizard、Visual studio、WizardBar等,实现了直观、可视化的程序设计风格,方便地编程和管理各种类,维护程序的源代码;封装了Windows的API函数、USER、KERNEL、GDI函数,简化了编程时创建、维护窗口的许多复杂的工作。
2.2.2 MFC技术
MFC,微软基础类,实际上是微软提供的,用于在C++环境下编写应用程序的一个框架和引擎,VC++是Windows下开发人员使用的专业C++SDK(SDK,Standard SoftWare Develop Kit,专业软件开发平台),MFC就是挂在它之上的一个辅助软件开发包,MFC同VC++集成的VCL一样是一个非外挂式的软件包,类库,只不过MFC类是微软为VC++专配的。
CSocket类是由CAsyncSocket继承而来的,事实上,在MFC中CAsyncSocket 逐个封装了WinSock API,每个CAsyncSocket对象代表一个Windows Socket对象,使用CAsyncSocket 类要求程序员对网络编程较为熟悉。相比起来,CSocket类是CAsyncSocket的派生类, 继承了它封装的WinSock API。
一个CSocket对象代表了一个比CAsyncSocket对象更高层次的Windows Socket的抽象,CSocket类与CSocketFile类和CArchive类一起工作来发送和接收数据,因此使用它更加容易使用。
2.2.3 Windows Sockets网络编程接口
选定Windows平台开发网络通信程序,可以选择Windows的Sockets编程接口,Windows Sockets是一套开放的、支持多种协议的Windows下的网络编程接口。现在的Winsock已经基本上实现了与协议无关,你可以使用Winsock来调用多种协议的功能,但较常使用的是TCP/IP协议。Windows Sockets无疑是我们进行网络编程的利器。所有的Windows Sockets实现都支持流套接字和数据报套接字。应用程序调用Windows Sockets的API实现相互之间的通信。Windows Sockets有利用下层的网络通信协议功能和操作系统调用实现实际的通信工作。它们之间的关系如图所示:
2.2.4 WSAAsyncSelect模型开发
WSAAsyncSelect()调用允许应用程序注册一个或多个感兴趣的网络事件。这一API调用用来取代探寻网络I/O调用。本函数用来请求Windows Sockets DLL为窗口句柄发一条消息-无论它何时检测到由lEvent参数指明的网络事件.要发送的消息由wMsg参数标明.被通知的套接口由s标识.。在select()或非阻塞I/O例程(例如send()和recv())已经被调用或将要被调用的情况下都可以使用WSAAsyncSelect()调用。在这种情况下,在声明感兴趣的网络事件时,你必须提供一个通知时使用的窗口句柄。那么在你生命的感兴趣的网络事件发生时,对应的窗口将收到一个基于消息的通知。
在一个MFC应用程序中,要想轻松处理多个网络协议,而又不牺牲灵活性时,可以考虑使用CAsyncSocket类,它的效率比CSocket 类要高。
2.2.5 TCP/IP协议
TCP/IP 是供已连接因特网的计算机进行通信的通信协议。TCP/IP是一个两层的程序。高层为传输控制协议,它负责聚集信息或把文件拆分成更小的包。这些包通过网络传送到接收端的TCP层,接收端的TCP层把包还原为原始文件。低层是网际协议,它处理每个包的地址部分,使这些包正确的到达目的地。网络上的网关计算机根据信息的地址来进行路由选择。即使来自同一文件的分包路由也有可能不同,但最后会在目的地汇合。TCP/IP使用客户端/服务器模式进行通信。两个系统间的多重连接是这样确认并协调一致的:原IP地址、目的IP地址、源端口、目的端口。端口是一个软件结构,被客户程序或服务进程用来发送和接收信息。服务进程通常使用一个固定的端口。这些端口号是“广为人知的”,因为在建立与特定主机或服务的连接时,需要这些地址和目的地址进行通讯。
2.2.6 多线程编程技术
在现代的各种实时监控系统和通信系统中,如果用户的应用程序需要有多个任务同时进行相应的处理,则使用多线程是较理想的选择。一个线程负责检查网络,另一个线程管理磁盘驱动器,还有一个线程负责显示数据,三个线程结合起来共同完成文件服务,使用者也可以及时看到网络的变化。多线程应用范围很广,尤其是目前的桌面平台上,系统的许多功能都能在一个系统下运行,更需要应用程序能够同时处理多个事件,而这些正是多线程可以实现的。Windows XP是多任务操作系统,程序对CPU的占用时间由系统决定。多任务指的是系统可以同时运行多个进程,每个进程又可以同时执行多个线程。进程是应用程序的运行实例,拥有自己的地址空间。每个进程拥有一个主线程,同时还可以建立其他的线程。线程是操作系统分配CPU时间的基本实体,每个进程占用的CPU时间由系统分配,系统不停的在线程之间切换。MFC多线程的编程方法包括:创建线程;启动线程;线程的终止。
在Win32环境下,如果要使用具有阻塞性质的套接字,应该放在独立的工作线程中处理,利用多线程的方法使阻塞不至于干扰其他线程,也不会把CPU时间浪费在阻塞上。多线程的方法既可以使程序员享受CSocket带来的简化编程的便利,也不会影响用户界面对用户的反应。
第三部分 总体设计
3.1 需求分析
该聊天程序分为服务器端和客户端两个部分。采用的是C/S(客户端/服务器)结构。
客户端实现功能:向在线人员发送信息并显示出在线用户,可以保存聊天记录。
服务器端实现功能:显示客户端在线用户,并显示所有在线用户的聊天记录。
3.2 系统流程图
客户端: 服务器端:
3.3 系统工作流程
3.4 概要设计
在编程软件Visual C++6.0基础上采用TCP协议的网络编程实现一款客户端到客户端的聊天程序,其中能使用VC的一些基本控件将程序的设计分为客户端与服务器。其中此程序客户端要与服务器相连时,首先输入服务器端的端口号(注意连接为0时连接失败,只要端口号大于0就可进行聊天了),客户端要在界面上输入相应的端口号和本地主机的IP地址。在客户端与服务器相连后在发送的文本框中输入你想发送的信息然后点击发送客户端(服务器)就能在接收的文本框内显示出相应的内容。
第四部分 详细设计
4.1 模块设计
●服务器端:
★弹出初始化对话框:创建监听套接字
★更新所有客户端:将新信息发送给每个客户端
★处理客户端的连接信息:生成一个新的套节字与客户端通讯;将该套节字保存起来
★ 接收数据:定义缓冲区;接收数据;将数据在列表框中显示出来;将数据发送给每个客户
● 客户端
★显示登录对话框:创建一个新的Socket;连接服务器;发送登录消息给服务器
★接收数据:定义缓冲区;接收数据;将数据在列表框中显示出来
★发送数据到服务器
4.2 程序的相关说明
★服务器程序的相关说明
①监听工作类CListenSocket是对CSocket的继承, CClientSocket接收来自客户端的连接请求,代表的是一个客户端
②在主界面类里if (!AfxSocketInit())
{
AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
return FALSE;
}
是负责对环境变量惊醒初始化,是MFC封装的函数
③if (m_pSocket->Create(dlg.m_nPort))
{
if (m_pSocket->Listen())
return TRUE;
}
创建监听工作套接字,然后进行监听,监听工作套接字开始工作
④当有消息到来,然后用m_pDlg->ProcessPendingAccept();接收到消息,然后进行消息传递,在CChatSvrDlg::ProcessPendingAccept()里对消息进行处理
⑤CPtrList m_connectionList;是利用MFC封装的链表类进行客户端管理,当有客户请求到来,将其加入到链表里
⑥OnReceive(int nErrorCode)函数是MFC对异步选择模型消息传递的封装,当有接收消息到来,该函数激活。其他消息也是如此。
⑦接收到消息,利用m_ctrlMsgs.AddString(buffer);添加到界面
★客户端程序相关说明
①class CChatSocket表示客户端工作套接字,是对CSocket的继承
②有消息到来,激活OnReceive函数,然后OnReceive函数利用ProcessPendingRead();将消息传给主线程进行处理
③m_pSocket->Send(str.GetBuffer(0),str.GetLength(),0);函数用来对消息进行发送
④在用MFC写的异步选择模型里,多线程的实现是MFC内部实现,由MFC创建多线程
第五部分 测试
5.1 测试的意义
本章对本系统做具体的测试,验证系统的功能是否得以实现。
5.2 软件测试的目标
(1)测试是为了发现程序中的错误而执行的过程;
(2)好的测试方案是极可能发现迄今为止尚未发现的错误的测试方案;
(3)成功的测试是发现了至今为止尚未发现的测试。
5.3 调试后结果:
◆客户端
◆服务器
第六部分 总结
经过将近一个月的课程设计,简单的模拟QQ聊天系统基本完成,系统基本功能基本实现,测试运行也基本正常。该系统基本上完成了客户端与服务器的连接,实现了客户端与客户端的聊天并显示相应记录。
在课程设计的初期阶段,我主要学习了与本课题相关的理论知识,包括:VC++的设置与开发,MFC下的软件开发过程等相关技术,socket编程技术和多线程开发技术,并完成客户端和服务器端文字信息传递实验。
在查阅部分资料逐渐了解系统需求后,我参照李超老师给我们发的需求分析规格说明书、系统总体设计说明书和详细设计说明书,编写了一个简单的总体设计和详细设计说明书。接着便进入了系统详细设计和编码阶段,在这个阶段,由于自己动手不足和对开发工具的陌生,最主要的是,对知识还不是熟练地掌握,系统遇到了很多大大小小的问题,如如何利用多线程、非堵塞I/O技术提高系统性能等,所以我的聊天程序是一个很简单的客户端与客户端的聊天程序。在一次次克服困难的过程中,我得到了极大的锻炼,获得了许多宝贵的软件开发经验和技巧,我相信这将为我今后的学习工作打下坚实的基础。而这对我来说也是一次丰富的收获。
当然这个系统还存在许多有待完善的地方:
▲ 功能相对较少,有待于添加,比方说像客户端与服务器相互发送信息,文件传输等功能;
▲ 在文字传输的同时增加表情发送的功能;
▲ 应使用户能够实现个人信息如昵称、密码等的修改;
▲ 界面设计得不够精致完美;
▲ 用户的权限设置应更加严谨,层次更加清晰。
这次课程设计的时间虽然不算很长,但使我对很多东西有了更深刻的认识。总结如下:
● 查阅资料和阅读相关文献的重要性。
● 向同学请教的重要性,团结协作的重要性。
● 勤动手的重要性,自己动手,丰衣足食!在一次次调试代码的过程中,我才明白“代码不是写出来的,是跳出来的”的道理。
● 对待任何事情都要有耐心和恒心,遇到问题要冷静地思考,积极找出症结所在,逐个解决。
通过本次课程设计,我更深刻的认识到了教学实践在大学课程中的重要性,同时也发觉到了自己在学习方面存在的不足之处,在以后的学习中我会努力改进这些不足,不断提高自己的动手实践能力。