课程设计报告_第1页
课程设计报告_第2页
课程设计报告_第3页
课程设计报告_第4页
课程设计报告_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、课课 程程 设设 计计 报报 告告课程名称 Vc 环境下的 Windows 编程 题 目 聊天通讯软件 指导教师 侯 霞 设计起止日期 系 别 计算机学院 专 业 计算机科学与技术 学生姓名 李杜松 班级/学号 计 0402/12 成 绩 一、功能说明.3二、课程设计开发环境:.31、套接字的介绍.32、WIN SOCK的介绍.4、Socket API.4、CAsyncSocket.5、CSocket.63、CSOCKET使用.6三、工程及设计.81、需求分析.8任务概述.8功能需求.81.3 性能需求.8运行需求.82、概要设计.8总体设计.8数据结构设计.9运行设计.9出错处理设计.10出

2、错处理对策:.103、详细设计.10总体设计.10需求概述.10软件结构.10界面总接口.11程序描述效劳器端.11程序描述客户端.164、程序实现.18运行界面及其效果图.18运行说明.195、测试方案.19测试用例 1连接与断开.19测试用例 2用户名传输.21测试用例 3发送与过滤.226、总结报告.24技术方案评价.24软件质量评价.24课程设计过程中软件开发时间分配评价.25经验与教训.25总结与体会.257、程序附录.26主要运行界面.26主要程序代码.26四、 参考文献.38一、功能说明一、功能说明1、 支持多个客户段在同时连接,在效劳器和多个客户段之间进行数据传输;2、 接受客

3、户端发送信息显示在一个列表框内;3、 在用户进入和离开时,发布适当的问候和欢送信息;4、 将接受的某一客户段的信息发给所有其他客户端程序,实现聊天室信息同步;5、 当效劳器停止效劳,向每个连接客户端发送效劳终止通告。二、课程设计开发环境:二、课程设计开发环境:操作系统:Windows XP开发工具:Visual C+网络环境:互联网,局域网,本机自联均可1、套接字的介绍、套接字的介绍随着计算机网络的普及和 Internet 的迅速开展,越来越多的程序具备了网上与其它程序通信的能力。无论是在局域网还是广域网,软件的通信都采取同样的原那么。类似如下列图:TCP/IP首先,一台计算机中某个程序等带着

4、一个程序的连接请求,这个应用程序正在“监听种种连接请求,就像你在等待某人来 时守在 机旁一样。同时,另一个应用程序试图与第一个程序连接。这种翻开连接的做法与你打 类似。就像在打 时你必须知道对方的 号码一样,应用程序要建立连接也必须知道对方网络地址。但是你的电脑程序从逻辑上从逻辑上不可能只用这一个地址来完成成千上万个程序的通信,所以除了网络地址ip端口孕育而生。每一个端口从逻辑上就解决了对每一个程序使用网络接口通信的问题。套接子,就等于是把端口,ip 等网络接口这功能和在一起的一个网络编程接口。通过他从逻辑的角度简化了通讯的接口。这样套接口通过下面的方法工作,事实上我的程序也是类似这么做的。发

5、送连接请求发送连接请求发送连接请求效劳器监控客户机效劳器端这样,我们只要了解学习套接口的原理和类方法,就可轻松实现程序网络互联通信。2、Win sock 的的介绍介绍因为程序的核心就是要依靠 MFC 封装类 CSocket 来实现。所以下面把 CSocket 类以及它的周边作一些介绍。首先 Socket 有同步阻塞方式和异步非阻塞方式两种使用,事实上同步和异步在我们编程的生涯中可能遇到了很多,而 Socket 也没什么特别。虽然同步好用,不费力,但不能满足一些应用场合,其效率也很低。也许初涉编程的人不能理解“同步(或阻塞)和“异步(或非阻塞),其实简单两句话就能讲清楚,同步和异步往往都是针对一

6、个函数来说的, “同步就是函数直到其要执行的功能全部完成时才返回,而“异步那么是,函数仅仅做一些简单的工作,然后马上返回,而它所要实现的功能留给别的线程或者函数去完成。例如,SendMessage 就是“同步函数,它不但发送消息到消息队列,还需要等待消息被执行完才返回;相反 PostMessage 就是个异步函数,它只管发送一个消息,而不管这个消息是否被处理,就马上返回。、Socket API首先应该知道,有 Socket1.1 提供的原始 API 函数,和 Socket2.0 提供的一组扩展函数,两套函数。这两套函数有重复,但是 2.0 提供的函数功能更强大,函数数量也更多。这两套函数可以灵

7、活混用,分别包含在头文件 Winsock.h,Winsock2.h,分别需要引入库 wsock32.lib、Ws2_32.lib。1、默认用作同步阻塞方式,那就是当你从不调用 WSAIoctl()和 ioctlsocket()来改变 Socket IO 模式,也从不调用 WSAAsyncSelect()和 WSAEventSelect()来选择需要处理的 Socket 事件。正是由于函数 accept(),WSAAccept(),connect(),WSAConnect(),send(),WSASend(),recv(),WSARecv()等函数被用作阻塞方式,所以可能你需要放在专门的线程里,

8、这样以不影响主程序的运行和主窗口的刷新。2、如果作为异步用,那么程序主要就是要处理事件。它有两种处理事件的方法:客户端客户端套接口效劳器套接口群客户端客户端套接口客户端客户端套接口客户端客户端套接口第一种,它常关联一个窗口,也就是异步 Socket 的事件将作为消息发往该窗口,这是由 WinSock 扩展标准里的一个函数 WSAAsyncSelect()来实现和窗口关联。最终你只需要处理窗口消息,来收发数据。第二种,用到了扩展标准里另一个关于事件的函数 WSAEventSelect(),它是用事件对象的方式来处理 Socket 事件,也就是,你必须首先用 WSACreateEvent()来创立

9、一个事件对象,然后调用 WSAEventSelect()来使得 Socket 的事件和这个事件对象关联。最终你将要在一个线程里用 WSAWaitForMultipleEvents()来等待这个事件对象被触发。这个过程也稍显复杂。2.2、CAsyncSocket看类名就知道,它是一个异步非阻塞 Socket 封装类,CAsyncSocket:Create()有一个参数指明了你想要处理哪些 Socket 事件,你关心的事件被指定以后,这个Socket 默认就被用作了异步方式。那么 CAsyncSocket 内部到底是如何将事件交给你的呢?CAsyncSocket 的 Create()函数,除了创立

10、了一个 SOCKET 以外,还创立了个CSocketWnd 窗口对象,并使用 WSAAsyncSelect()将这个 SOCKET 与该窗口对象关联,以让该窗口对象处理来自 Socket 的事件(消息),然而 CSocketWnd 收到 Socket事件之后,只是简单地回调 CAsyncSocket:OnReceive(),CAsyncSocket:OnSend(),CAsyncSocket:OnAccept(),CAsyncSocket:OnConnect()等虚函数。所以CAsyncSocket 的派生类,只需要在这些虚函数里添加发送和接收的代码。然而,最不容易被初学 Socket 编程的

11、人理解的,也是本文最要提醒的一点是,客户方在使用 CAsyncSocket:Connect()时,往往返回一个 WSAEWOULDBLOCK 的错误(其它的某些函数调用也如此),实际上这不应该算作一个错误,它是 Socket 提醒我们,由于你使用了非阻塞 Socket 方式,所以(连接)操作需要时间,不能瞬间建立。既然如此,我们可以等待呀,等它连接成功为止,于是许多程序员就在调用Connect()之后,Sleep(0),然后不停地用 WSAGetLastError()或者CAsyncSocket:GetLastError()查看 Socket 返回的错误,直到返回成功为止。这是一种错误的做法,

12、断言,你不能到达预期目的。事实上,我们可以在 Connect()调用之后等待 CAsyncSocket:OnConnect()事件被触发,CAsyncSocket:OnConnect()是要说明 Socket 要么连接成功了,要么连接彻底失败了。至此,我们在CAsyncSocket:OnConnect()被调用之后就知道是否 Socket 连接成功了,还是失败了。类似的,Send()如果返回 WSAEWOULDBLOCK 错误,我们在 OnSend()处等待,Receive()如果返回 WSAEWOULDBLOCK 错误,我们在 OnReceive()处等待,以此类推。还有一点,也许是个难点,

13、那就是在客户方调用 Connect()连接效劳方,那么效劳方如何 Accept(),以建立连接的问题。简单的做法就是在监听的 Socket 收到OnAccept()时,用一个新的 CAsyncSocket 对象去建立连接,于是,上面的 pSocket 和客户方建立了连接,以后的通信就是这个 pSocket 对象去和客户方进行,而监听的 Socket 仍然继续在监听,一旦又有一个客户方要连接效劳方,那么上面的 OnAccept()又会被调用一次。当然 pSocket 是和客户方通信的效劳方,它不会触发 OnAccept()事件,因为它不是监听 Socket。2.3、CSocketCSocket

14、是 MFC 在 CAsyncSocket 根底上派生的一个同步阻塞 Socket 的封装类。它是如何又把 CAsyncSocket 变成同步的,而且还能响应同样的 Socket 事件呢?其实很简单,CSocket 在 Connect()返回 WSAEWOULDBLOCK 错误时,不是在 OnConnect(),OnReceive()这些事件终端函数里去等待。你先必须明白 Socket事件是如何到达这些事件函数里的。这些事件处理函数是靠 CSocketWnd 窗口对象回调的,而窗口对象收到来自 Socket 的事件,又是靠线程消息队列分发过来的。总之,Socket 事件首先是作为一个消息发给 C

15、SocketWnd 窗口对象,这个消息肯定需要经过线程消息队列的分发,最终 CSocketWnd 窗口对象收到这些消息就调用相应的回调函数(OnConnect()等)。所以,CSocket 在调用 Connect()之后,如果返回一个 WSAEWOULDBLOCK错误时,它马上进入一个消息循环,就是从当前线程的消息队列里取关心的消息,如果取到了 WM_PAINT 消息,那么刷新窗口,如果取到的是 Socket 发来的消息,那么根据 Socket 是否有操作错误码,调用相应的回调函数(OnConnect()等)。这样就能保证技能接收到信息,又能保险证界面的响应。3、CSocket 使用使用我前两

16、天编的是 FTP 客户端,但是因为除了上机时间外都在家里编程,没有可用的效劳器供我连接,并且现在的效劳器加了各种各样的东西不让你舒服连上,所以我最后也只好选择了聊天程序。接触了 FTP 之后再作聊天程序,才发现 FTP 是要比聊天程序多了使用 CSocketFile 类和 CArchive 类FTP 必须使用这两个类,而聊天工具如果不是为了保存信息就用不到 。类似下列图:CSocketFileCArchiveCSocketCSocketCArchiveCSocketFile文件文件文件文件效劳器端效劳器端网络网络客户端客户端命令命令命令命令CSocketCSocket可见 FTP 需要至少两个

17、端口,一个提供命令交换也就是 21 端口 ,一个提供文件数据交换上图省略了上传文件的路径,只有下载文件的路径 。这样实现起来比聊天程序要困难一些。主要对于没有接触过 CSocket 类的我就是难上加难。所以我选择了只使用 CSocket 类的聊天编程。聊天程序只需要下面局部的交换即:聊天信息聊天信息聊天信息聊天信息CSocketCSocket网络网络效劳器端效劳器端客户端客户端但是真正细化编码会发现,其实要比想象的要复杂许多。当然我说的是逻辑上。见下列图:注: 为触发,并不是直接调用客户端客户端客户端客户端Socket()Bind()Conect()Socket()Bind()Listen()

18、OnAccept侦听套接字侦听套接字Socket()OnReceive()Send()Close()连接套接字连接套接字Close()Close()Send()OnReceive()网络网络CString 可省略CString 可省略三、工程及设计三、工程及设计1、需求分析、需求分析任务概述任务概述目标:实现完成效劳器-客户传输,客户-客户传输,群传,单传功能。运行环境:使用 MFC 开发功能需求功能需求1、效劳器建立与停止可在不同端口建立;断开时要对客户发送信息2、客户连接和断开可对不同效劳器ip进行连接同时向其他客户发送信息;断开时要对效劳器和其他用户发送信息。3、识别客户昵称防止重名功能

19、;4、发送信息可选择单一发送,或者群发;5、接受信息时间和信息显示在屏幕上。6、保存信息功能保存聊天信息7、客户端过滤功能只接受个人信息8、效劳端强行关闭客户功能踢人的功能性能需求性能需求数据精度:数据精度:1、消息数据可以随意长2、命令数据固定,但是交换客户姓名的时候除外。3、大多数据都是 CString 类型有少数 char*类时间特性:时间特性:适应网络特点,应当注意软件的响应时间。传输数据要经可能的小。软件适应性:软件适应性:可在任意 Windows 操作系统执行移植性:移植性: 软件本身没有移植性,但是其类可以反复调用。运行需求运行需求用户界面需要人性化外。硬件接口、软件接口、故障处

20、理均并没有的要求2、概要设计、概要设计总体设计总体设计软件只分两层界面层和逻辑层,因为时间有限,所以没有参加数据库来保存数据。效劳器端:效劳器端:界面层:界面层:主要都是提供主要都是提供逻辑层:逻辑层:主要是接受主要是接受客户端:客户端:逻辑层:逻辑层:界面层:界面层:端口信息端口信息输出窗口信息输出窗口信息输入窗口信息输入窗口信息输出对象窗口信息输出对象窗口信息效劳开始模块效劳开始模块发信息模块发信息模块侦听套接口侦听套接口对应客户套接口对应客户套接口转发客户信息模块转发客户信息模块客户对应效劳器套接口客户对应效劳器套接口效劳器地址效劳器地址端口端口输出窗口信息输出窗口信息输入窗口信息输入窗

21、口信息输出对象窗口信息输出对象窗口信息客户连接离开模块客户连接离开模块聊天开始模块聊天开始模块昵称昵称接受信息模块接受信息模块发送信息模块发送信息模块网络局部由网络局部由 CSocket 自己解决自己解决聊天关闭模块聊天关闭模块效劳关闭模块效劳关闭模块模块之间的通信已经省略模块之间的通信已经省略数据结构设计数据结构设计逻辑结构:逻辑结构:主要依靠 CSocket 完成网络局部,所以所有逻辑结构都是基于 CSokcet 的。见上图,首先需要侦听套接口,之后得到消息后,为客户创立新的对应的套接口,以后通信使用这个。而侦听套接口新的用户的接入。物理结构设计:物理结构设计:没有物理层面上的设计数据结构

22、与程序的关系:数据结构与程序的关系:CSocket 套接口结构是整个软件的核心当然还有 MFC 其他根本结构 。除此之外本软件再没有其他数据结构。值得提出来的是。我们需要 CSocket 的派生类。出于某种需要,我们必须产生以CSocket 为父类的派生类如:CListeningSocket CClientSocket CChatSocket。这些类的OnReceive(),OnAccept(),是自动调用的,我们只需要 Override 它们,就可实现我们的信息联通。运行设计运行设计事实上,本软件实在太小,没有什么可划分的模块勉强的划分一下,如上页的接口模块图。在运行的时候它们彼此联系紧密,

23、耦合性很大,所以倒不如说是一个整体。但是出于想让软件的介绍更加明确,我们还是把它分成几个模块。这些模块需要先运行“开始模块,最后执行“关闭模块,其他模块都能在这两个模块调用之间调用。出错处理设计出错处理设计出错输出信息出错输出信息:客户端客户端:1、连接失败信息2、ip 错误信息3、端口错误信息4、昵称错误信息5、输入为空信息6、套接口创立失败信息7、套接口自身检查出错信息效劳器效劳器1、 效劳开启失败信息2、 套接口创立失败信息3、 侦听失败信息4、 输入为空信息5、 套接口自身检查出错信息出错处理对策:出错处理对策:根本采用出错就绕过的方法。比方,现在你输入非法数值,马上 AfxMessa

24、geBox(“错误信息);return;关闭操作;这样做防止了不必要的操作。3、详细设计、详细设计总体设计总体设计需求概述需求概述本局部需要把上面的理论复制与实际编码软件结构软件结构根本定义已经不变,此局部与概要设计相同。值得注意的是值得注意的是 MFC 提供了 WinSock 的初始化包括头文件:“还有调用AfxSocketInit()他在主 cpp 文件的 InitInstance()里调用只有他调用成功,才能正常使用 Socket。界面总接口界面总接口效劳器端:效劳器端:变量 ID变量类型 变量名称用处按键开始效劳按键关闭效劳按键发送信息按键复制信息按键清空按键踢人组合框发送对象编辑框输

25、入编辑框输出显示编辑框端口记录客户端:客户端:变量 ID变量类型 变量名称用处按键连接效劳器按键发送信息按键断开效劳器按键保存信息按键清空信息复选框过滤信息组合框发送对象文本框发送信息文本框记录效劳器 ip文本框记录端口文本框记录昵称文本框用来显示程序描述程序描述效劳器端效劳器端CListeningSocket 类类主要功能:主要功能:用于侦听,创立保存客户 CClientSocket 。主要参数:主要参数:m_client 就是 CClientSocket数组 。它从 10 是空的,用于群发信息时的标志开始保存客户 CSocket(实际上是下面介绍的 CClientSocket)。 m_cl

26、ientnum 记录客户数量。类似指针长度。并且在 OnAccept 时候当作分配CClientSocket:m_clientNO 的根据。m_pDlg 就是主窗体句柄。方便互相调用。m_nMsgCount 原本意记录信息量条数 ,但后来没有用上。主要成员函数:主要成员函数:OnAcceptint nErrorCode主要功能:主要功能:重载父类 OnAccept(int nErrorCode)用于在侦听后,接受客户端 Connect()时自行调用的函数。里面有产生新的 CClientSocket的构造函数和初始化函数。输入项输入项:int nErrorCode。因为是重载函数具体这个东西做什

27、么用还不太清楚,看上去像是错误类别号。输出项:输出项:void算法:算法: 使用简单的判断语句,没有使用任何算法。程序逻辑:程序逻辑:构造函数:构造函数:CListeningSocketCServerDlg *pDlg功能:功能:就是初始化类参数输入项:输入项:CServerDlg *pDlg析构函数:析构函数:CListeningSocket ;保持默认CClientSocket 类类主要功能:主要功能:对应每一个用户的套接口,实现接受功能。当然也实现发送功能(发送功能没有重载是因为在对话框类内进行了修改)。主要参数:主要参数:m_clentName 用于记录昵称,在首次传输中得到。m_cl

28、ientNO 用于记录当前客户在 m_client 的位置,以确定删除和发送信息。m_isfirst 判断是否为第一次传输如果是那么显示 True。父类 OnAccept(nErrorCode)增加用户创立对应用户的 CClientSocket 实例,放入 client 数组里新建的客户套接口Accept设置新建客户套接口的代号成功失败很少发生结束删除对应套接口较少用户数量开始创立失败忽略!assert:绝对不会失败m_pDlg 用法同样在 CListeningSocket主要成员函数主要成员函数OnReceive(int nErrorCode)主要功能:主要功能:重载父类 OnReceive

29、(int nErrorCode)在接受信息时触发,自动处理转发给其他用户。当然也给自己的 ListBox 加信息。输入项输入项:int nErrorCode输出项:输出项:void算法:算法:使用简单的判断语句,没有使用任何算法。程序逻辑:程序逻辑:构造函数:构造函数:CClientSocketCServerDlg *pDlg功能:就是初始化类参数输入项:CServerDlg *pDlg析构函数:析构函数:CClientSocket ;保持默认CServerDlg 类类对话框主类对话框主类主要功能:主要功能:创立对话框,完成界面所有模块的具体功能。主要参数:主要参数:m_BS 开始效劳按钮变量

30、用于禁用选择。 m_BSt 终止效劳按钮变量用于禁用选择父类 OnReceive (nErrorCode)Receive 读取信息得到发送对象如果是第一次是否传输已登录用户信息增加用户昵称群发信息客户昵称重名否开始开始是否关闭命令否是是否过滤命令否是是否为群发否是单发信息设置过滤项群发此用户关闭信息删除操作结束效劳器端显示返回昵称重名错误结束是群发新登录用户信息效劳器端显示m_BtnSend 发送按钮变量用于禁用选择m_in 输入框变量m_nServerPort 端口框变量m_out 输出框变量m_pSocket 侦听套接口指针m_to 发送对象变量主要成员函数:主要成员函数:void Add

31、StringCString str主要功能:把字符串显示在编辑框内,增加了时间和换行。int Getto(CString name)主要功能:把字符串对应的套接口编号找出来返回。void OnOK()主要功能:编辑框按 Enter 默认调用 OnOK()。如果不重载,将会造成关闭对话框的情况。所以修改成传送输入框的信息到OnBtnSend(),这样就类似 QQ 的直接按 Enter 发送信息的模式。程序逻辑:见右- void Deletem_to(CString str);主要功能:删除对应字符串的组合框记录传送对象值。BOOL SameName(CString str);主要功能:查找是否有

32、与输入串相同的远程(已登录)客户昵称。void DeleteOne(int NO);主要功能:删除对应号码的登录客户套接口。void SendTo(CString str,int NO);主要功能:把消息送给 NO 号码的套接口用户。void SendAll(CString str,int NO);主要功能:把消息传送给除了除了 NO 号码套接口客户外号码套接口客户外的所有用户。程序逻辑:见右- afx_msg void OnBtnstart();OnOK()得到当前焦点assert 焦点非空uID 是发送编辑框框是否得到焦点 uID发送按键可用是否发送到发送按键事件结束否否标记小于最大用户数

33、是SendAll();初始华标记标记自加 1标记是 NO是否标记用户是过滤用户是结束发送信息主要功能:开始效劳。程序逻辑:类似最开始总体设计局部的逻辑,在此就不多说。afx_msg void OnBtnstop();主要功能:停止效劳,并通知所有用户。afx_msg void OnBtnSend();主要功能:发送信息。afx_msg void OnCopyAll();主要功能:拷贝显示用编辑框内所有内容。afx_msg void OnClear();主要功能:清空显示用编辑框。afx_msg void OnKick();主要功能:删除当前组合框内的用户,并通知其它用户。程序逻辑:见右- 程序

34、描述程序描述客户端客户端CChatSocket 类类主要功能:主要功能:发送和接收效劳器信息的套接口类,继承CSocket.主要参数:主要参数:m_pDlg 跟效劳器端样不赘述m_needUpdate 其实和效劳器端 isfirst 一个性质,首次传输由此判断主要成员函数:主要成员函数:OnReceive(int nErrorCode)主要更能:主要更能:同效劳器,主要能够判别系统来的信息和命令。CChatClientDlg 类类对话框主类对话框主类是否OnKick();得到当前组合框内用户名称名称是“所有人给出不能删除信息删除组合框内对应信息组合框归位得到用户 client 中位置号群发用户

35、被踢信息对用户发送关闭信息显示信息删除操作结束主要功能:主要功能:主要负责对话框的构造初始化,连接效劳器及实现其它所有功能主要参数:主要参数:m_pSocket CChatSocket*类型变量来保存套接口m_out 显示用编辑框 m_Btnsend 发送按键变量m_to 发送对象m_ip 效劳器地址编辑框m_port 效劳器端口编辑框m_name 用户昵称编辑框m_in 输入编辑框m_lv 过滤设置变量主要成员函数:主要成员函数:void AddString(CString str);主要功能:在显示编辑框中怎加时间,信息,换行。void OnOK();主要功能:重载 OnOK(),在编辑框

36、中默认 Enter 调用函数。如果是发送编辑框那么调用发送按钮函数。void Deletem_to(char* str,int length);主要功能:删除对应用户名称。void CopytoClipboard(CString str);主要功能:调用系统剪贴板,粘贴字符串。void newName(char* str,int length);主要功能:从信息中找到新用户的名字。void Disconnect();主要功能:与效劳器断开连接操作。为了效劳器发来的断开信息单独分开。主要是操作空间的 Enable。afx_msg void OnBtnconnect();主要功能:连接操作。串标志

37、位自加 1串是否结束是否是否为开关符是否开关已开是否开关反置是否为名结束符是Deletem_to 开始开始保存名字非空是删除对应寻找对应名称在对象框结束否否保存一个字符afx_msg void OnBtnSend();主要功能:发送功能。afx_msg void OnDisConnect();主要功能:自主断开连接时调用,会现象效劳器发送信息,之后断开。afx_msg void OnCopyAll();主要功能:全部拷贝。afx_msg void OnButton5();主要功能:清空显示编辑框。afx_msg void OnCheck1();主要功能:当点击过滤选择框时,发送信息到效劳器来更

38、改自己过滤状态。4、程序实现、程序实现运行界面及其效果图运行界面及其效果图效劳器界面效劳器界面由于时间原因,界面布置的并不是十分漂亮。并且很多按键布置的可能不太合理。但总的来说,应该能很好的完成任务了。按键开始效劳按键关闭效劳按键发送信息按键复制信息按键清空按键踢人组合框发送对象编辑框输入OnBtnSend 开始开始接受界面数据结束串为空提示出错是否得到发送对象组合对象和内容发送内容显示框显示发送框清空编辑框输出显示编辑框端口记录客户端界面客户端界面按键连接效劳器按键发送信息按键断开效劳器按键保存信息按键清空信息复选框过滤信息组合框发送对象文本框发送信息文本框记录效劳器ip文本框记录端口文本框

39、记录昵称文本框用来显示运行说明运行说明需要先运行效劳器端的“开始效劳,之后是客户端的“连接,软件才能正常工作。5、测试方案、测试方案测试用例测试用例 1连接与断开连接与断开目的:目的:测试连接建立和断开情况步骤及操作步骤及操作:1、 效劳器端“效劳开始按钮 客户端“连接按钮2、 效劳器端“效劳开始按钮 客户端“连接按钮效劳器端“效劳中止按钮3、 效劳器端“无操作 客户端“连接按钮4、 客户端:“连接按钮效劳器端“效劳开始按钮客户端“连接按钮5、 效劳器端“效劳开始按钮 “停止效劳按钮 客户端“连接按钮6、 效劳器端“效劳开始按钮 “停止效劳按钮 “效劳开始按钮 客户端“连接按钮7、 效劳器端“

40、效劳开始按钮 客户端“连接按钮 “断开按钮8、 效劳器端“效劳开始按钮 客户端“连接按钮 “断开按钮 “连接按钮9、 多用户效劳器端“效劳开始按钮 客户端 1“连接按钮客户端2“连接按钮客户端 3“连接按钮10、9 之后,依次“关闭11、9 之后,效劳器“停止效劳结果:结果:下面序号对应上面试验用例下面序号对应上面试验用例1、结果正常,说明正常顺序下的单用户登录没有问题效劳器端:10:39:40效劳开始!10:39:43:lidusong:进入聊天室!他是第1 位客人。客户端:10:39:43您已经成功登陆!2、结果正常,说明效劳器关闭不会导致客户端错误效劳器端:10:39:40效劳开始!10

41、:39:43:lidusong:进入聊天室!他是第1 位客人。10:41:20效劳终止!客户端:10:39:43您已经成功登陆!10:41:20效劳关闭!结果正常,说明客户端检测不到效劳器不会出现崩溃。客户端:无法连接效劳对话框,提示重连 3、结果正常,说明客户端建立连接撤销后,在进行连接不会出错。4、结果正常,客户端提示无法找到效劳器。说明效劳器确实关闭了。5、结果正常,说明效劳器关闭后再起不会出现错误。效劳器端:0:48:30效劳开始!10:48:30效劳终止!10:48:31效劳开始!10:48:33:lidusong:进入聊天室!他是第 1 位客人。客户端:10:48:33您已经成功登

42、陆!6、结果正常,说明客户可以正常断开连接。效劳器端:10:48:33:lidusong:进入聊天室!他是第1 位客人。10:50:12:lidusong:退出聊天室客户端:10:48:33您已经成功登陆!10:50:12您与效劳器断开!7、结果正常,说明客户端在断开连接后,再登录不会出错。效劳器端:10:56:03:lidusong:进入聊天室!他是第1 位客人。10:56:04:lidusong:退出聊天室10:56:04:lidusong:进入聊天室!他是第1 位客人。客户端:10:56:03您已经成功登陆!10:56:04您与效劳器断开!10:56:04您已经成功登陆!8、结果正常,特

43、意测试了重命名登录,系统会提示给用户,软件正常效劳器端:10:57:41效劳开始!10:57:45:lidusong:进入聊天室!他是第 1 位客人。10:57:47:2:进入聊天室!他是第 2 位客人。10:57:49有客户重名名登陆!已经断开10:57:51:1:进入聊天室!他是第 3 位客人。客户端 1:10:57:45您已经成功登陆!10:57:47:2:进入聊天室!他是第 2 位客人。10:57:51:1:进入聊天室!他是第 3 位客人。客户端 2:10:57:47您已经成功登陆!10:57:51:1:进入聊天室!他是第 3 位客人。客户端 3:10:57:49您已经成功登陆!10:

44、57:49您已经与系统断开!10:57:49您的昵称与其他人重名,请更改!10:57:51您已经成功登陆!9、结果正常,说明在多用户下,客户的退出没有问题。并且通知其他客户很及时。效劳器端:11:01:24:lidusong:退出聊天室11:01:26:2:退出聊天室11:01:27:1:退出聊天室客户端 1:11:01:24您与效劳器断开!客户端 2:11:01:24:lidusong:退出聊天室11:01:26您与效劳器断开!客户端 3:11:01:24:lidusong:退出聊天室11:01:26:2:退出聊天室11:01:27您与效劳器断开!10、结果正常,效劳器端,客户端都关闭了连接

45、,并且都不能互相通信。效劳器端:11:02:49效劳终止!所有客户端:11:02:49效劳关闭!评价评价此工程测试完全通过,因为提示错误和错误处理做得很完善,所以没有出现意外情况。测试用例测试用例 2用户名传输用户名传输目的:目的:测试连接建立后用户名称的传递和更新。步骤及操作:步骤及操作:1、效劳器端“开始效劳客户端“连接2、效劳器端“开始效劳客户端 1“连接客户端 2“连接3、1 之后 客户端“断开4、2 之后 客户端 1“断开客户端 2“断开结果:结果:下面序号对应上面试验用例下面序号对应上面试验用例1、结果正常,说明正常顺序下的单用户登录,效劳器端会纪录客户信息,而客户不会受到别的信息

46、。效劳器端:客户端:2、结果正常,说明正常顺序下的多用户登录,效劳器端会纪录客户信息,并向心登录客户发送现在已经登录的客户信息。当新用户登录时,效劳器还会转发,新用户登录信息给别的用户。效劳器端:客户端 1:客户端 1:3、结果正常,说明登录后,正常退出,效劳器会正常删除登录客户信息。效劳器端:客户端:4、结果正常,说明所有客户正常退出后,都正常。效劳器端:客户端 1:客户端 2:评价:评价:所有功能正常,说明在传送名称上的编程,还算成功。虽然方法土了一点全部是拿字符串传输 。测试用例测试用例 3发送与过滤发送与过滤目的:目的:测试连接建立后用户名间,或者效劳器与用户的信息传递和客户的信息过滤

47、。步骤及操作:步骤及操作:1、效劳器端“开始效劳客户端“连接 “发送信息效劳器端:“发送信息2、效劳器端“开始效劳客户端 1:“连接客户端 2“连接 “发送信息客户端 1“发送信息效劳器端:“发送信息3、2 之后 客户端 4 连接客户端 1 向“客户端 2“发送“信息客户端 2 向“客户端 1“发送“信息效劳器向“客户端 1“发送“信息4、2 之后 客户端 2“群发屏蔽效劳器端:“发送信息客户端 1“发送群发信息向“客户端 2” “发送信息结果:结果:下面序号对应上面试验用例下面序号对应上面试验用例1、结果正常,说明单用户于效劳器聊天正常效劳器端:02:19:21效劳开始!02:19:24:l

48、idusong:进入聊天室!他是第1 位客人。02:19:53lidusong 对 大家 说 你好02:20:02效劳器 对 所有人 说 你好客户端:02:19:24您已经成功登陆!02:19:53我对 所有人 说 你好02:20:02效劳器 对 所有人 说 你好2、结果正常,说明多用户群聊正常效劳器端:02:21:13效劳开始!02:21:15:lidusong:进入聊天室!他是第1 位客人。02:21:16:123:进入聊天室!他是第 2 位客人。02:21:37123 对 大家 说 大家好02:21:46lidusong 对 大家 说 大家好02:21:48效劳器 对 所有人 说 大家好

49、客户端 1:02:21:15您已经成功登陆!02:21:16:123:进入聊天室!他是第 2 位客人。02:21:37123 对 大家 说 大家好02:21:46我对 所有人 说 大家好02:21:48效劳器 对 所有人 说 大家好客户端 2:02:21:16您已经成功登陆!02:21:37我对 所有人 说 大家好02:21:46lidusong 对 大家 说 大家好02:21:48效劳器 对 所有人 说 大家好3、结果正常,说明多用户,单聊得实现,效劳器可以看见所有人的信息。客户之间能看见传给自己的单聊。4、效劳器端:02:24:36效劳开始!02:24:37:lidusong:进入聊天室!

50、他是第 1 位客人。02:24:38:123:进入聊天室!他是第 2 位客人。02:24:41:4:进入聊天室!他是第 3 位客人。02:25:47lidusong 对 123 说 hallo!02:25:56123 对 lidusong 说 hallo!02:26:04效劳器 对 lidusong 说 hallo02:26:10效劳器 对 123 说 hallo客户端 1:02:24:37您已经成功登陆!02:24:38:123:进入聊天室!他是第 2 位客人。02:24:41:4:进入聊天室!他是第 3 位客人。02:25:47我对 123 说 hallo!02:25:56123 对 li

51、dusong 说 hallo!02:26:04效劳器 对 lidusong 说 hallo 客户端 2:客户端 2:02:24:38您已经成功登陆!02:24:41:4:进入聊天室!他是第 3 位客人。02:25:47lidusong 对 123 说 hallo!02:25:56我对 lidusong 说 hallo!02:26:10效劳器 对 123 说 hallo客户端 3:02:24:41您已经成功登陆!5、客户之间屏蔽工作正常,但是效劳器的群发也被屏蔽了。这是一个错误。效劳器端:02:32:12效劳开始!02:32:12:lidusong:进入聊天室!他是第 1 位客人。02:32:1

52、3:123:进入聊天室!他是第 2 位客人。02:32:14:4:进入聊天室!他是第 3 位客人。02:32:22123 设置为过滤群发信息!02:32:39效劳器 对 所有人 说 这里是效劳器02:33:34lidusong 对 大家 说 这里是客户端 102:33:40lidusong 对 123 说 你好客户端 1:02:32:12您已经成功登陆!02:32:13:123:进入聊天室!他是第 2 位客人。02:32:14:4:进入聊天室!他是第 3 位客人。02:32:39效劳器 对 所有人 说 这里是效劳器02:33:34我对 所有人 说 这里是客户端 102:33:40我对 123

53、说 你好客户端 2:02:32:13您已经成功登陆!02:32:14:4:进入聊天室!他是第 3 位客人。02:33:40lidusong 对 123 说 你好客户端 3:02:32:14您已经成功登陆!02:32:39效劳器 对 所有人 说 这里是效劳器02:33:34lidusong 对 大家 说 这里是客户端 1评价:评价:发送功能很成功,但是屏蔽功能是后参加的,错误就出现了。这也是软件检错局部唯一的建功点。6、总结报告、总结报告技术方案评价技术方案评价首先在对 CSocket 完全不了解的前提下,通过学习和实践,把软件做出来并完成了任务,从这一点上,在技术方面的评奖应该很高的。但是,很

54、多书都应用了串行化处理这一步,使用 CArchive 类。而作者,认为 CSocket 局部还不太了解呢,这时候再引入不了解的类会对整个编程的难度有较大的增加。所以决定,想另外的方法,实现传输。结果说明,整个软件的理解到达了一定程度。但在信息传递的有效性和正规方面做得很差。以至于,相对的降低了开发效率用户姓名传输局部,请看代码局部的 OnReceive 函数 。所以在整体上技术方面并不能给高分。软件质量评价软件质量评价从自己的角度,看这个软件质量只能是良好,而不能是优。因为大局部的 Bug 处理都是CSocket 自己能够应对的。很大一局部大漏洞不出现的原因都是因为 CSocket 自己太强悍

55、了。其实作者对 Bug 的修补并不能做到尽善尽美。但是还是或多或少的做了一些修改,使得软件用起来不会出现崩溃的情况。课程设计过程中软件开发时间分配评价课程设计过程中软件开发时间分配评价因为课程设计,大多数时间还是用在了软件的编码和逻辑局部用下列图可以表示我的分配情况;选择题目,阅览有关书籍,掌握必要知识根据书上的例子,一步一步跟着完成。第 1 周第 2 周周 1周 2周 3周 4周 5周 6周 1周 2周 3周 4周 5周 6脱离介绍书籍,自己发挥和想象功能。 因为书上的串行化自己觉得太难了修改 Bug 并增加一些小功能并开始写报告。来学校向老师报告制作成果。在家里写课程设计报告。在逻辑上,O

56、nReceive 中分辨用户名信息的局部花的时间最长。因为这局部就是书上没有介绍的局部,也是我自己独特的局部。经验与教训经验与教训对于没有接触的领域,应该在思想上弄明白,在着手去做。如果上来就忙于制作,而不把制作的内容弄明白很容易造成返工的情况。其实地一周的前 4 天我实在做 FTP,幸好我现在做得软件与 FTP 是相通着,不然我真的来不及作完了。周 5 之后我发现我对 CSocket 有了新的认识。才明白她的调用原理。还有机制。和重载的意义。之后的几天里才高速的完成了编码。其实逻辑上很是简单。但我却编辑了那么长的时间。看出来前几天我对知识的掌握还是很初级的阶段。希望以后能吸取这样的教训。总结

57、与体会总结与体会其实总的体会就是觉得软件这个行当,以后的工作可能就是不断地接触新的事物,我要编程的东西,肯定我自己还不是很了解他。当编程完了以后,才能真正地对她有了初步的认识。所以说在这个行当,就是要多编程,才能有长进。虽然这次编程没有大三大二,编程量那么吓人我记得大三自己编过了 500 行,自己有的逻辑,自己编完了都想不起来了其作用了。但是这次到没有这种情况但是还是觉得编的时候,进度缓慢,力不从心。或者说满脑子想法,但就是实现不了。这个原因就是对 CSocket 类的理解太过于初步。现在当然也不能说就弄透了,但是起码比 1 周前要好很多。最后其实这个报告的前局部大局部都是在制作软件之前应该写

58、好的,但是 1 个人做这个东西就没有按着这个步骤去做。所以前局部或多或少都失去了写的价值。都是编完之后总结的内容。软件测试局部还是测试出很多错误来的。但是都打了很多的补丁,在今天,写报告的时候已经没什么错误了。即便如此还是发现了一个过滤错误。可见我的软件编程的熟练程度还不到家阿。希望能把这次经验带到下礼拜的新的课程设计上去。7、程序附录、程序附录主要运行界面主要运行界面 客户端效劳器端主要程序代码主要程序代码效劳器端:效劳器端:void CListeningSocket:OnAccept(int nErrorCode) /connect 触发CSocket:OnAccept(nErrorCod

59、e);/固定模式调用父类对应方法this-m_clientnum+;/新用户增加用户总量this-m_clientm_clientnum=new CClientSocket(CListeningSocket:m_pDlg);/创立对应客户的套接口if(CListeningSocket:Accept(*m_clientm_clientnum)/接受!使用新创立的套接口m_clientm_clientnum-m_clientNO=m_clientnum;/计数,把当前数给 clientelse/如果失败很少发生delete m_clientm_clientnum;/撤销对应套接口m_clientn

60、um-;/用户减 1void CClientSocket:OnReceive(int nErrorCode) CSocket:OnReceive(nErrorCode);/同理char buffer200;/缓存int re;/个数if(re=Receive(buffer,199,0)0)/接受最长 199 字bufferre=0;/最后一位+结尾符号CString name=buffer;/用于更新用户名称!if(this-m_isfirst)/是否为第一次if(m_pDlg-SameName(name)/如果有重名退出连接m_pDlg-SendTo(CMD:SAMENAME,this-m_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论