简单网络聊天工具.doc_第1页
简单网络聊天工具.doc_第2页
简单网络聊天工具.doc_第3页
简单网络聊天工具.doc_第4页
简单网络聊天工具.doc_第5页
免费预览已结束,剩余33页可下载查看

下载本文档

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

文档简介

1 38 目录 一 功能说明 3 二 课程设计开发环境 3 1 套接字的介绍 3 2 WIN SOCK的介绍 4 2 1 Socket API 4 2 2 CAsyncSocket 5 2 3 CSocket 6 3 CSOCKET使用 6 三 工程及设计 8 1 需求分析 8 1 1 任务概述 8 1 2 功能需求 8 1 3 性能需求 8 1 4 运行需求 8 2 概要设计 8 2 1 总体设计 8 2 2 数据结构设计 9 2 3 运行设计 9 2 4 出错处理设计 10 2 5 出错处理对策 10 3 详细设计 10 3 1 总体设计 10 3 1 1 需求概述 10 3 1 2 软件结构 10 3 1 3 界面总接口 11 3 2 程序描述 服务器端 11 3 3 程序描述 客户端 16 4 程序实现 18 4 1 运行界面及其效果图 18 4 2 运行说明 19 5 测试计划 19 5 1 测试用例 1 连接与断开 19 5 2 测试用例 2 用户名传输 21 5 3 测试用例 3 发送与过滤 22 6 总结报告 24 6 1 技术方案评价 24 6 2 软件质量评价 24 6 3 课程设计过程中软件开发时间分配评价 25 6 4 经验与教训 25 6 5 总结与体会 25 2 38 7 程序附录 26 7 1 主要运行界面 26 7 2 主要程序代码 26 四 参考文献 38 一 功能说明一 功能说明 1 支持多个客户段在同时连接 在服务器和多个客户段之间进行数据传输 2 接受客户端发送信息显示在一个列表框内 3 在用户进入和离开时 发布适当的问候和欢迎信息 4 将接受的某一客户段的信息发给所有其他客户端程序 实现聊天室信息同步 5 当服务器停止服务 向每个连接客户端发送服务终止通告 二 课程设计开发环境 二 课程设计开发环境 操作系统 Windows XP 开发工具 Visual C 网络环境 互联网 局域网 本机自联均可 1 套接字的介绍 套接字的介绍 随着计算机网络的普及和 Internet 的迅速发展 越来越多的程序具备了网上与其它 程序通信的能力 无论是在局域网还是广域网 软件的通信都采取同样的原则 类似 如下图 TCP IP 首先 一台计算机中某个程序等带领一个程序的连接请求 这个应用程序正在 监听 种种连接请求 就像你在等待某人来电话时守在电话机旁一样 同时 另一 个应用程序试图与第一个程序连接 这种打开连接的做法与你打电话类似 就像在打 电话时你必须知道对方的电话号码一样 应用程序要建立连接也必须知道对方网络地 址 但是你的电脑程序从逻辑上从逻辑上不可能只用这一个地址来完成成千上万个程序的通信 所以除了网络地址 ip 端口孕育而生 每一个端口从逻辑上就解决了对每一个程序 使用网络接口通信的问题 发送连接请求 发送连接请求 发送连接请求 服务器 监控 客户机 3 38 套接子 就等于是把端口 ip 等网络接口这功能和在一起的一个网络编程接口 通过他从逻辑的角度简化了通讯的接口 这样套接口通过下面的方法工作 事实上我 的程序也是类似这么做的 这样 我们只要了解学习套接口的原理和类方法 就可轻松实现程序网络互联通 信 2 Win sock 的的介绍介绍 因为程序的核心就是要依靠 MFC 封装类 CSocket 来实现 所以下面把 CSocket 类 以及它的周边作一些介绍 首先 Socket 有同步阻塞方式和异步非阻塞方式两种使用 事实上同步和异步在我 们编程的生涯中可能遇到了很多 而 Socket 也没什么特别 虽然同步好用 不费劲 但不能满足一些应用场合 其效率也很低 也许初涉编程的人不能理解 同步 或阻塞 和 异步 或非阻塞 其实简单两 句话就能讲清楚 同步和异步往往都是针对一个函数来说的 同步 就是函数直到 其要执行的功能全部完成时才返回 而 异步 则是 函数仅仅做一些简单的工作 然后马上返回 而它所要实现的功能留给别的线程或者函数去完成 例如 SendMessage 就是 同步 函数 它不但发送消息到消息队列 还需要等待消息被执 行完才返回 相反 PostMessage 就是个异步函数 它只管发送一个消息 而不管这个 消息是否被处理 就马上返回 2 1 Socket API 首先应该知道 有 Socket1 1 提供的原始 API 函数 和 Socket2 0 提供的一组扩展 函数 两套函数 这两套函数有重复 但是 2 0 提供的函数功能更强大 函数数量也 更多 这两套函数可以灵活混用 分别包含在头文件 Winsock h Winsock2 h 分别 需要引入库 wsock32 lib Ws2 32 lib 1 默认用作同步阻塞方式 那就是当你从不调用 WSAIoctl 和 ioctlsocket 来改 客户端 客户端套接口 服务器套接口群 服务器端 客户端 客户端套接口 客户端 客户端套接口 客户端 客户端套接口 4 38 变 Socket IO 模式 也从不调用 WSAAsyncSelect 和 WSAEventSelect 来选择需要处 理的 Socket 事件 正是由于函数 accept WSAAccept connect WSAConnect send WSASend recv WSARecv 等函数被用作阻塞方式 所以可能你需要放 在专门的线程里 这样以不影响主程序的运行和主窗口的刷新 2 如果作为异步用 那么程序主要就是要处理事件 它有两种处理事件的办法 第一种 它常关联一个窗口 也就是异步 Socket 的事件将作为消息发往该窗口 这是由 WinSock 扩展规范里的一个函数 WSAAsyncSelect 来实现和窗口关联 最终 你只需要处理窗口消息 来收发数据 第二种 用到了扩展规范里另一个关于事件的函数 WSAEventSelect 它是用 事件对象的方式来处理 Socket 事件 也就是 你必须首先用 WSACreateEvent 来创 建一个事件对象 然后调用 WSAEventSelect 来使得 Socket 的事件和这个事件对象关 联 最终你将要在一个线程里用 WSAWaitForMultipleEvents 来等待这个事件对象被 触发 这个过程也稍显复杂 2 2 CAsyncSocket 看类名就知道 它是一个异步非阻塞 Socket 封装类 CAsyncSocket Create 有 一个参数指明了你想要处理哪些 Socket 事件 你关心的事件被指定以后 这个 Socket 默认就被用作了异步方式 那么 CAsyncSocket 内部到底是如何将事件交给你 的呢 CAsyncSocket 的 Create 函数 除了创建了一个 SOCKET 以外 还创建了个 CSocketWnd 窗口对象 并使用 WSAAsyncSelect 将这个 SOCKET 与该窗口对象关 联 以让该窗口对象处理来自 Socket 的事件 消息 然而 CSocketWnd 收到 Socket 事件之后 只是简单地回调 CAsyncSocket OnReceive CAsyncSocket OnSend CAsyncSocket OnAccept CAsyncSocket OnConnect 等虚函数 所以 CAsyncSocket 的派生类 只需要在这些虚函数里添加发送和接收的代码 然而 最不容易被初学 Socket 编程的人理解的 也是本文最要提醒的一点是 客户方在使用 CAsyncSocket Connect 时 往往返回一个 WSAEWOULDBLOCK 的 错误 其它的某些函数调用也如此 实际上这不应该算作一个错误 它是 Socket 提 醒我们 由于你使用了非阻塞 Socket 方式 所以 连接 操作需要时间 不能瞬间建 立 既然如此 我们可以等待呀 等它连接成功为止 于是许多程序员就在调用 Connect 之后 Sleep 0 然后不停地用 WSAGetLastError 或者 CAsyncSocket GetLastError 查看 Socket 返回的错误 直到返回成功为止 这是一 种错误的做法 断言 你不能达到预期目的 事实上 我们可以在 Connect 调用之 后等待 CAsyncSocket OnConnect 事件被触发 CAsyncSocket OnConnect 是要表 明 Socket 要么连接成功了 要么连接彻底失败了 至此 我们在 CAsyncSocket OnConnect 被调用之后就知道是否 Socket 连接成功了 还是失败了 类似的 Send 如果返回 WSAEWOULDBLOCK 错误 我们在 OnSend 处等待 5 38 Receive 如果返回 WSAEWOULDBLOCK 错误 我们在 OnReceive 处等待 以此 类推 还有一点 也许是个难点 那就是在客户方调用 Connect 连接服务方 那么服 务方如何 Accept 以建立连接的问题 简单的做法就是在监听的 Socket 收到 OnAccept 时 用一个新的 CAsyncSocket 对象去建立连接 于是 上面的 pSocket 和客户方建立了连接 以后的通信就是这个 pSocket 对象 去和客户方进行 而监听的 Socket 仍然继续在监听 一旦又有一个客户方要连接服 务方 则上面的 OnAccept 又会被调用一次 当然 pSocket 是和客户方通信的服务 方 它不会触发 OnAccept 事件 因为它不是监听 Socket 2 3 CSocket CSocket 是 MFC 在 CAsyncSocket 基础上派生的一个同步阻塞 Socket 的封装类 它是如何又把 CAsyncSocket 变成同步的 而且还能响应同样的 Socket 事件呢 其实很简单 CSocket 在 Connect 返回 WSAEWOULDBLOCK 错误时 不是 在 OnConnect OnReceive 这些事件终端函数里去等待 你先必须明白 Socket 事件是如何到达这些事件函数里的 这些事件处理函数是靠 CSocketWnd 窗口对 象回调的 而窗口对象收到来自 Socket 的事件 又是靠线程消息队列分发过来的 总之 Socket 事件首先是作为一个消息发给 CSocketWnd 窗口对象 这个消息肯 定需要经过线程消息队列的分发 最终 CSocketWnd 窗口对象收到这些消息就调 用相应的回调函数 OnConnect 等 所以 CSocket 在调用 Connect 之后 如果返回一个 WSAEWOULDBLOCK 错误时 它马上进入一个消息循环 就是从当前线程的消息队列里取关心的消息 如果取到了 WM PAINT 消息 则刷新窗口 如果取到的是 Socket 发来的消息 则根据 Socket 是否有操作错误码 调用相应的回调函数 OnConnect 等 这样就能保证技能接收到信息 又能保险证界面的响应 3 CSocket 使用使用 我前两天编的是 FTP 客户端 但是因为除了上机时间外都在家里编程 没有可 用的服务器供我连接 并且现在的服务器加了各种各样的东西不让你舒服连上 所以 我最后也只好选择了聊天程序 接触了 FTP 之后再作聊天程序 才发现 FTP 是要比 聊天程序多了使用 CSocketFile 类和 CArchive 类 FTP 必须使用这两个类 而聊天工 具如果不是为了保存信息就用不到 类似下图 6 38 CSocketFile CArchive CSocketCSocket CArchive CSocketFile文件文件文件文件 服务器端服务器端 网络网络 客户端客户端 命令命令命令命令CSocketCSocket 可见 FTP 需要至少两个端口 一个提供命令交换 也就是 21 端口 一个提供 文件数据交换 上图省略了上传文件的路径 只有下载文件的路径 这样实现起来 比聊天程序要困难一些 主要对于没有接触过 CSocket 类的我就是难上加难 所以我 选择了只使用 CSocket 类的聊天编程 聊天程序只需要下面部分的交换即 聊天信息聊天信息聊天信息聊天信息CSocketCSocket 网络网络 服务器端服务器端客户端客户端 但是真正细化编码会发现 其实要比想象的要复杂许多 当然我说的是逻辑上 见下图 7 38 注 为触发 并不是直接调用 客户端客户端 客户端客户端 Socket Bind Conect Socket Bind Listen OnAccept 侦听套接字侦听套接字 Socket OnReceive Send Close 连接套接字连接套接字 Close Close Send OnReceive 网络网络 CString 可省 略 CString 可省 略 三 工程及设计三 工程及设计 1 需求分析 需求分析 1 1 任务概述任务概述 目标 实现完成服务器 客户传输 客户 客户传输 群传 单传功能 运行环境 使用 MFC 开发 1 2 功能需求功能需求 1 服务器建立与停止 可在不同端口建立 断开时要对客户发送信息 2 客户连接和断开 可对不同服务器 ip 进行连接同时向其他客户发送信息 断 开时要对服务器和其他用户发送信息 3 识别客户昵称 防止重名功能 4 发送信息 可选择单一发送 或者群发 5 接受信息 时间和信息显示在屏幕上 6 保存信息功能 保存聊天信息 7 客户端过滤功能 只接受个人信息 8 服务端强行关闭客户功能 踢人的功能 8 38 1 3 性能需求性能需求 数据精度 数据精度 1 消息数据可以随意长 2 命令数据固定 但是交换客户姓名的时候除外 3 大多数据都是 CString 类型有少数 char 类 时间特性 时间特性 适应网络特点 应当注意软件的响应时间 传输数据要经可能的小 软件适应性 软件适应性 可在任意 Windows 操作系统执行 移植性 移植性 软件本身没有移植性 但是其类可以反复调用 1 4 运行需求运行需求 用户界面需要人性化外 硬件接口 软件接口 故障处理均并没有的要求 2 概要设计 概要设计 2 1 总体设计总体设计 软件只分两层界面层和逻辑层 因为时间有限 所以没有加入数据库来保存数据 服务器端 服务器端 界面层 主要都是提供 界面层 主要都是提供 逻辑层 主要是接受 逻辑层 主要是接受 客户端 客户端 逻辑层 逻辑层 界面层 界面层 端口信息端口信息 输出窗口信息输出窗口信息 输入窗口信息输入窗口信息输出对象窗口信息输出对象窗口信息 服务开始模块服务开始模块发信息模块发信息模块 侦听套接口侦听套接口 对应客户套接口对应客户套接口 转发客户信息模块转发客户信息模块 客户对应服务器套接口客户对应服务器套接口 服务器地址服务器地址端口端口输出窗口信息输出窗口信息输入窗口信息输入窗口信息输出对象窗口信息输出对象窗口信息 客户连接离开模块客户连接离开模块 聊天开始模块聊天开始模块 昵称昵称 接受信息模块接受信息模块发送信息模块发送信息模块 网络部分由网络部分由 CSocket 自己解决自己解决 聊天关闭模块聊天关闭模块 服务关闭模块服务关闭模块 模块之间的通信已经省略模块之间的通信已经省略 9 38 2 2 数据结构设计数据结构设计 逻辑结构 逻辑结构 主要依靠 CSocket 完成网络部分 所以所有逻辑结构都是基于 CSokcet 的 见上图 首先需要侦听套接口 之后得到消息后 为客户创建新的对应的套接口 以后通信使 用这个 而侦听套接口新的用户的接入 物理结构设计 物理结构设计 没有物理层面上的设计 数据结构与程序的关系 数据结构与程序的关系 CSocket 套接口结构是整个软件的核心 当然还有 MFC 其他基本结构 除此之外 本软件再没有其他数据结构 值得提出来的是 我们需要 CSocket 的派生类 出于某种需要 我们必须产生以 CSocket 为父类的派生类如 CListeningSocket CClientSocket CChatSocket 这些类的 OnReceive OnAccept 是自动调用的 我们只需要 Override 它们 就可实现我们的信 息联通 2 3 运行设计运行设计 事实上 本软件实在太小 没有什么可划分的模块勉强的划分一下 如上页的接 口模块图 在运行的时候它们彼此联系紧密 耦合性很大 所以倒不如说是一个整体 但是 出于想让软件的介绍更加明确 我们还是把它分成几个模块 这些模块需要先运行 开始模块 最后执行 关闭模块 其他模块都能在这两 个模块调用之间调用 2 4 出错处理设计出错处理设计 出错输出信息出错输出信息 客户端 客户端 1 连接失败信息 2 ip 错误信息 3 端口错误信息 4 昵称错误信息 5 输入为空信息 6 套接口创建失败信息 7 套接口自身检查出错信息 服务器 服务器 1 服务开启失败信息 2 套接口创建失败信息 3 侦听失败信息 4 输入为空信息 10 38 5 套接口自身检查出错信息 2 5 出错处理对策 出错处理对策 基本采用出错就绕过的方法 比如 现在你输入非法数值 马上 AfxMessageBox 错误信息 return 关闭操 作 这样做避免了不必要的操作 3 详细设计 详细设计 3 1 总体设计总体设计 3 1 1 需求概述需求概述 本部分需要把上面的理论复制与实际编码 3 1 2 软件结构软件结构 基本定义已经不变 此部分与概要设计相同 值得注意的是值得注意的是 MFC 提供了 WinSock 的初始化包括头文件 Afxsock h 还有调用 AfxSocketInit 他在主 cpp 文件的 InitInstance 里调用 只有他调用成功 才能正常使 用 Socket 3 1 3 界面总接口界面总接口 服务器端 服务器端 变量 ID变量类型 变量名称用处 按键 开始服务 按键 关闭服务 按键 发送信息 按键 复制信息 按键 清空 按键 踢人 组合框 发送对象 编辑框 输入 编辑框 输出显示 编辑框 端口记录 客户端 客户端 变量 ID变量类型 变量名称用处 按键 连接服务器 11 38 按键 发送信息 按键 断开服务器 按键 保存信息 按键 清空信息 复选框 过滤信息 组合框 发送对象 文本框 发送信息 文本框 记录服务器 ip 文本框 记录端口 文本框 记录昵称 文本框 用来显示 3 2 程序描程序描 述 服务器端 述 服务器端 3 2 1CListeningSocket 类类 主要功能 主要功能 用于侦听 创建保存客户 CClientSocket 主要参数 主要参数 m client 就是 CClientSocket 数组 它从 1 0 是空的 用于群发信息时的标志 开 始保存客户 CSocket 实际上是下面介绍的 CClientSocket m clientnum 记录客户数量 类似指针长度 并且在 OnAccept 时候当作分配 CClientSocket m clientNO 的根据 m pDlg 就是主窗体句柄 方便互相调用 m nMsgCount 原本意记录信息量 条数 但后来没有用上 主要成员函数 主要成员函数 OnAccept int nErrorCode 主要功能 主要功能 重载父类 OnAccept int nErrorCode 用于在侦听后 接受客户端 Connect 时自行调用的函数 里面有产生新的 CClientSocket 的构造函数和初始化函数 输入项输入项 int nErrorCode 因为是重载函数具体这个东西做什么用还不太清楚 看上去像是错 误类别号 12 38 输出项 输出项 void 算法 算法 使用简单的判断语句 没有使用任何算法 程序逻辑 程序逻辑 构造函数 构造函数 CListeningSocket CServerDlg pDlg 功能 功能 就是初始化类参数 输入项 输入项 CServerDlg pDlg 析构函数 析构函数 CListeningSocket 保持默认 3 2 2CClientSocket 类类 主要功能 主要功能 对应每一个用户的套接口 实现接受功能 当然也实现发送功能 发送功能没有重载是因 为在对话框类内进行了修改 主要参数 主要参数 m clentName 用于记录昵称 在首次传输中得到 m clientNO 用于记录当前客户在 m client 的位置 以确定删除和发送信息 m isfirst 判断是否为第一次传输如果是则显示 True m pDlg 用法同样在 CListeningSocket 主要成员函数主要成员函数 父类 OnAccept nErrorCode 增加用户 创建对应用户的 CClientSocket 实例 放入 client 数组里 新建的客户套接口 Accept 设置新建客户套接口的代号 成功 失败 很少发生 结束 删除对应套接口 较少用户数量 开始 创建失败忽略 assert 绝对不会失败 13 38 OnReceive int nErrorCode 主要功能 主要功能 重载父类 OnReceive int nErrorCode 在接受信息时触发 自动处理转发给其他用户 当 然也给自己的 ListBox 加信息 输入项输入项 int nErrorCode 输出项 输出项 void 算法 算法 使用简单的判断语句 没有使用任何算法 程序逻辑 程序逻辑 构造函数 构造函数 CClientSocket CServerDlg pDlg 功能 就是初始化类参数 输入项 CServerDlg pDlg 析构函数 析构函数 CClientSocket 保持默认 3 2 3CServerDlg 类 对话框主类 类 对话框主类 主要功能 主要功能 创建对话框 完成界面所有模块的具体功 能 主要参数 主要参数 m BS 开始服务按钮变量用于禁用选择 m BSt 终止服务按钮变量用于禁用选择 m BtnSend 发送按钮变量用于禁用选择 m in 输入框变量 父类 OnReceive nErrorCode Receive 读取信息 得到发送对象 如果是第一次 是 否 传输已登录用户信息增加用户昵称 群发信息 客户昵称重名 否 开始开始 是否关闭命令 否 是 是否过滤命令 否 是 是否为群发 否 是 单发信息 设置过滤项 群发此用户关闭信息 删除操作 结束 服务器端显示 返回昵称重名错误 结束 是群发新登录用户信息 服务器端显示 14 38 m nServerPort 端口框变量 m out 输出框变量 m pSocket 侦听套接口指针 m to 发送对象变量 主要成员函数 主要成员函数 void AddString CString str 主要功能 把字符串显示在编辑框内 增加了时间和换行 int Getto CString name 主要功能 把字符串对应的套接口编号找出来返回 void OnOK 主要功能 编辑框按 Enter 默认调用 OnOK 如果不重载 将会造成关闭对话框的情况 所以修改成传送输入框的信息到 OnBtnSend 这样就类似 QQ 的直接按 Enter 发送信息的模式 程序逻辑 见右 void Deletem to CString str 主要功能 删除对应字符串的组合框 记录传送对象 值 BOOL SameName CString str 主要功能 查找是否有与输入串相同的远程 已登录 客户昵称 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 发送按键可用 是 否 发送到发送按键事件 结束 否 否 标记小于最 大用户数 是 SendAll 初始华标记 标记自加 1 标记是 NO 是 否 标记用户是 过滤用户 是 结束 发送信息 15 38 afx msg void OnBtnstop 主要功能 停止服务 并通知所有用户 afx msg void OnBtnSend 主要功能 发送信息 afx msg void OnCopyAll 主要功能 拷贝显示用编辑框内所有内容 afx msg void OnClear 主要功能 清空显示用编辑框 afx msg void OnKick 主要功能 删除当前组合框内的用户 并通知其它用户 程序逻辑 见右 3 3 程序描述 客户端 程序描述 客户端 3 3 1CChatSocket 类类 主要功能 主要功能 发送和接收服务器信息的套接口类 继承 CSocket 主要参数 主要参数 m pDlg 跟服务器端样 不赘述 m needUpdate 其实和服务器端 isfirst 一个 性质 首次传输由此判断 主要成员函数 主要成员函数 OnReceive int nErrorCode 主要更能 主要更能 同服务器 主要能够判别系统来的 信息和命令 3 3 2CChatClientDlg 类 对话框主类 类 对话框主类 主要功能 主要功能 主要负责对话框的构造初始化 连接服务 是 否 OnKick 得到当前组合框内用户名称 名称是 所有人 给出不能删除信息 删除组合框内对应信息 组合框归位 得到用户 client 中位置 号 群发用户被踢信息 对用户发送关闭信息 显示信息 删除操作 结束 16 38 器及实现其它所有功能 主要参数 主要参数 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 在编辑框中默认 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 主要功能 连接操作 串标志位自加 1 串是否 结束 是 否 是否为 开关符 是 否 开关已开 是否 开关反置 是否为名 结束符 是 Deletem to 开始开始 保存名字 非空 是 删除对应 寻找对应名称在对象 框 结束 否 否 保存一个 字符 17 38 afx msg void OnBtnSend 主要功能 发送功能 afx msg void OnDisConnect 主要功能 自主断开连接时调用 会现象服务器 发送信息 之后断开 afx msg void OnCopyAll 主要功能 全部拷贝 afx msg void OnButton5 主要功能 清空显示编辑框 afx msg void OnCheck1 主要功能 当点击过滤选择框时 发送信息到服 务器来更改自己过滤状态 4 程序实现 程序实现 4 1 运行界面及其效果图运行界面及其效果图 服务器界面服务器界面 由于时间原因 界 面布置的并不是十分漂 亮 并且很多按键布置 的可能不太合理 但总的来说 应该 能很好的完成任务了 按键 开始服务 按键 关闭服务 按键 发送信息 按键 复制信息 按键 清空 按键 踢人 组合框 发送对象 编辑框 输入 编辑框 输出显示 OnBtnSend 开始开始 接受界面数据 结束 串为空 提示出错 是 否 得到发送对象 组合对象和内容 发送内容显示框显示 发送框清空 18 38 编辑框 端口记录 客户端界面客户端界面 按键 连接服务器 按键 发送信息 按键 断开服务器 按键 保存信息 按键 清空信息 复选框 过滤信息 组合框 发送对象 文本框 发送信息 文本框 记录服务器 ip 文本框 记录端口 文本框 记录昵称 文本框 用来显示 4 2 运行说明运行说明 需要先运行服务器端的 开始服务 之后是客户端的 连接 软件才能正常工作 5 测试计划 测试计划 5 1 测试用例测试用例 1 连接与断开 连接与断开 目的 目的 测试连接建立和断开情况 步骤及操作步骤及操作 1 服务器端 服务开始 按钮 客户端 连接 按钮 2 服务器端 服务开始 按钮 客户端 连接 按钮 服务器端 服务中止 按钮 3 服务器端 无操作 客户端 连接 按钮 4 客户端 连接 按钮 服务器端 服务开始 按钮 客户端 连接 按钮 5 服务器端 服务开始 按钮 停止服务 按钮 客户端 连接 按钮 19 38 6 服务器端 服务开始 按钮 停止服务 按钮 服务开始 按钮 客 户端 连接 按钮 7 服务器端 服务开始 按钮 客户端 连接 按钮 断开 按钮 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 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 您已经成功登陆 6 结果正常 说明客户可以正常断开连接 服务器端 10 48 33 lidusong 进入聊天室 他是第 1 位客人 10 50 12 lidusong 退出聊天室 客户端 10 48 33 您已经成功登陆 10 50 12 您与服务器断开 20 38 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 结果正常 特意测试了重命名登录 系统会提示给用户 软件正常 服务器端 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 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 结果正常 服务器端 客户端都关闭了连接 并且都不能互相通信 服务器端 11 02 49 服务终止 所有 客户端 11 02 49 服务关闭 评价评价 此项目测试完全通过 因为提示错误和错误处理做得很完善 所以没有出现意外情况 21 38 5 2 测试用例测试用例 2 用户名传输 用户名传输 目的 目的 测试连接建立后用户名称的传递和更新 步骤及操作 步骤及操作 1 服务器端 开始服务 客户端 连接 2 服务器端 开始服务 客户端 1 连接 客户端 2 连接 3 1 之后 客户端 断开 4 2 之后 客户端 1 断开 客户端 2 断开 结果 下面序号对应上面试验用例 结果 下面序号对应上面试验用例 1 结果正常 说明正常顺序下的单用户登录 服务器端会纪录客户信息 而客户不会受到 别的信息 服务器端 客户端 2 结果正常 说明正常顺序下的多用户登录 服务器端会纪录客户信息 并向心登录客户 发送现在已经登录的客户信息 当新用户登录时 服务器还会转发 新用户登录信息给 别的用户 服务器端 客户端 1 客户端 1 3 结果正常 说明登录后 正常退出 服务器会正常删除登录客户信息 服务器端 客户端 4 结果正常 说明所有客户正常退出后 都正常 服务器端 客户端 1 客户端 2 评价 评价 所有功能正常 说明在传送名称上的编程 还算成功 虽然方法土了一点 全部是拿字 符串传输 22 38 5 3 测试用例测试用例 3 发送与过滤 发送与过滤 目的 目的 测试连接建立后用户名间 或者服务器与用户的信息传递和客户的信息过滤 步骤及操作 步骤及操作 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 lidusong 进入聊天室 他是第 1 位客人 02 19 53 lidusong 对 大家 说 你好 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 37 123 对 大家 说 大家好 02 21 46 lidusong 对 大家 说 大家好 02 21 48 服务器 对 所有人 说 大家好 客户端 1 02 21 15 您已经成功登陆 02 21 16 123 进入聊天室 他是第 2 位 客人 02 21 37 123 对 大家 说 大家好 02 21 46 我对 所有人 说 大家好 02 21 48 服务器 对 所有人 说 大家好 客户端 2 02 21 16 您已经成功登陆 02 21 37 我对 所有人 说 大家好 02 21 46 lidusong 对 大家 说 大家好 02 21 48 服务器 对 所有人 说 大家好 3 结果正常 说明多用户 单聊得实现 服务器可以看见所有人的信息 客户之间能看见 传给自己的单聊 4 服务器端 02 24 36 服务开始 02 24 37 lidusong 进入聊天室 他是第 1 位客人 23 38 02 24 38 123 进入聊天室 他是第 2 位客人 02 24 41 4 进入聊天室 他是第 3 位客人 02 25 47 lidusong 对 123 说 hallo 02 25 56 123 对 lidusong 说 hallo 02 26 04 服务器 对 lidusong 说 hallo 02 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 56 123 对 lidusong 说 hallo 02 26 04 服务器 对 lidusong 说 hallo 客 户端 2 客户端 2 02 24 38 您已经成功登陆 02 24 41 4 进入聊天室 他是第 3 位客 人 02 25 47 lidusong 对 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 13 123 进入聊天室 他是第 2 位客人 02 32 14 4 进入聊天室 他是第 3 位客人 02 32 22 123 设置为过滤群发信息 02 32 39 服务器 对 所有人 说 这里是服务器 02 33 34 lidusong 对 大家 说 这里是客户端 1 02 33 40 lidusong 对 123 说 你好 客户端 1 02 32 12 您已经成功登陆 02 32 13 123 进入聊天室 他是第 2 位客人 02 32 14 4 进入聊天室 他是第 3 位客人 02 32 39 服务器 对 所有人 说 这里是服务器 02 33 34 我对 所有人 说 这里是客户端 1 02 33 40 我对 123 说 你好 客户端 2 02 32 13 您已经成功登陆 02 32 14 4 进入聊天室 他是第 3 位客人 02 33 40 lidusong 对 123 说 你好 客户端 3 02 32 14 您已经成功登陆 02 32 39 服务器 对 所有人 说 这里是服务器 02 33 34 lidusong 对 大家 说 这里是客户端 1 24 38 评价 评价 发送功能很成功 但是屏蔽功能是后加入的 错误就出现了 这也是软件检错部分唯一 的建功点 6 总结报告 总结报告 6 1 技术方案评价技术方案评价 首先在对 CSocket 完全不了解的前提下 通过学习和实践 把软件做出来并完成了任务 从这一点上 在技术方面的评奖应该很高的 但是 很多书都应用了串行化处理这一步 使 用 CArchive 类 而作者 认为 CSocket 部分还不太了解呢 这时候再引入不了解的类会对 整个编程的难度有较大的增加 所以决定 想另外的办法 实现传输 结果表明 整个软件 的理解达到了一定程度 但在信息传递的有效性和正规方面做得很差 以至于 相对的降低 了开发效率 用户姓名传输部分 请看代码部分的 OnReceive 函数 所以在整体上技术方 面并不能给高分 6 2 软件质量评价软件质量评价 从自己的角度 看这个软件质量只能是良好 而不能是优 因为大部分的 Bug 处理都是 CSocket 自己能够应对的 很大一部分大漏洞不出现的原因都是因为 CSocket 自己太强悍了 其实作者对 Bug 的修补并不能做到尽善尽美 但是还是或多或少的做了一些修改 使得软 件用起来不会出现崩溃的情况 6 3 课程设计过程中软件开发时间分配评价课程设计过程中软件开发时间分配评价 因为课程设计 大多数时间还是用在了软件的编码和逻辑部分用下图可以表示我的分配 情况 选择题目 阅览有关书 籍 掌握必 要知识 根据书上的 例子 一步 一步跟着完 成 第 1 周第 2 周 周 1周 2周 3周 4周 5周 6周 1周 2周 3周 4周 5周 6 脱离介绍书籍 自己发挥 和想象功能 因为书上 的串行化自己觉得太难了 修改 Bug 并 增加一些小 功能并开始 写报告 来学校向老师报告制作 成果 在家里写课程设 计报告 在逻辑上 OnReceive 中分辨用户名信息的部分花的时间最长 因为这部分就是书上没 有介绍的部分 也是我自己独特的部分 25 38 6 4 经验与教训经验与教训 对于没有接触的领域 应该在思想上弄明白 在着手去做 如果上来就忙于制作 而不 把制作的内容弄明白很容易造成返工的情况 其实地一周的前 4 天我实在做 FTP 幸好我现 在做得软件与 FTP 是相通着 不然我真的来不及作完了 周 5 之后我发现我对 CSocket 有了 新的认识 才明白她的调用原理 还有机制 和重载的意义 之后的几天里才高速的完成了 编码 其实逻辑上很是简单 但我却编辑了那么长的时间 看出来前几天我对知识的掌握还 是很初级的阶段 希望以后能吸取这样的教训 6 5 总结与体会总结与体会 其实总的体会就是觉得软件这个行当 以后的工作可能就是不断地接触新的事物 我要 编程的东西 肯定我自己还不是很了解他 当编程完了以后 才能真正地对她有了初步的认 识 所以说在这个行当 就是要多编程 才能有长进 虽然这次编程没有大三大二 编程量 那么吓人 我记得大三自己编过了 500 行 自己有的逻辑 自己编完了都想不起来了其作用 了 但是这次到没有这种情况 但是还是觉得编的时候 进度缓慢 力不从心 或者说满脑 子想法 但就是实现不了 这个原因就是对 CSocket 类的理解太过于初步 现在当然也不能 说就弄透了 但是起码比 1 周前要好很多 最后其实这个报告的前部分 大部分 都是

温馨提示

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

评论

0/150

提交评论