聊天系统-程序设计实践报告_第1页
聊天系统-程序设计实践报告_第2页
聊天系统-程序设计实践报告_第3页
聊天系统-程序设计实践报告_第4页
聊天系统-程序设计实践报告_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

精品文档 1欢迎下载 程序设计实践 设 计 报 告 课题名称 网络聊天程序的设计和实现 学生姓名 班 级 班内序号 学 号 日 期 精品文档 2欢迎下载 1 课题概述 1 1 课题目标和主要内容 课题实现的主要内容 本程序实现一个简单的网络聊天程序 采用客户机 服务器 Client Server 模式 将客户端和服务端功能在一个程序中实现 运行时在不同的计算 机上打开此程序即可进行聊天 程序实现一对多 多对多聊天功能 满足聊天的基本功能 课题目标 学会使用 MFC 搭建基本的对话框及基本控件的使用 了解 socket 套接 字相关知识 实现简单聊天程序 通过实践复习巩固课堂所学的理论知识 提高对所学知 识的综合应用能力 使用的开发平台 Microsoft Visual Studio 2010 windows7 采用的主要工具 计算机 相关图书资料 1 2 系统的主要功能 功能列表或功能框图 以及功能的简 要说明 服务器端 后台操作消息管理 建 立 服 务 器 监 听 客 户 请 求 游 客 进 入 聊 天 室 发 送 消 息 系 统 接 收 消 息 系 统 精品文档 3欢迎下载 客户端 后台操作消息管理 连 接 服 务 器 接 收 消 息 发 送 消 息 显 示 消 息 服务器端负责指定 ip 地址及端口号 建立服务器 有监听 接受 发送消息等功能 客户 端通过指定的 ip 及端口号来连接服务器 有接受和发送消息等功能 2 系统设计 2 1 系统总体框架 包括系统框架图或层次逻辑图 设计思想等 首先由服务器在指定的端口开通指定的服务 然后在客户机通过指定服务器地址 端口来连接服务器以获得指定的服务 服务器端服务器端 首先由一个服务器启动一个线程监听来自客户器的 Socket 连接 当服务器的 Socket 与客户器的 Socket 经过 TCP 协议的 3 次握手建立了连接后 双方就可以通过这个连接来进 行信息的发送和接收 并可以进行文件的传输 在进行程序设计时 对于多个用户连接服 务器采用了多线程处理 每个客户端的 Socket 都启动一个线程来连接服务端的 Socket 服务端的 Socket 接受连接后 通过一个结构体保存已经连接的客户端的地址和套接字 当 客户端发送一个信息到服务端 服务器接收信息后 再从结构体中取出已保存的套接字转 服务器客户机 精品文档 4欢迎下载 发所收到的信息 客户端客户端 由客户端的 Socket 提出连接请求 要连接的目标是服务器端的 Socket 为此 客户 端的 Socket 首先要描述它要连接的服务器端 socket 然后再定位所要连接的服务器端 Socket 与此同时服务端已经启动了一个监听的 Socket 这样便在客户端和服务器端通过 Sockets 建立了连接 2 2 系统详细设计 1 模块划分图及描述 模块分为连接服务器模块和建立服务器模块 服务器和客户端是相同的界面显示 输入服务器 IP 点击建立服务器即可建立服务器 显示 服务器建立成功 用户运行 程序后 输入服务器的 IP 端口号 点击连接服务器 显示 连接服务器成功 服务器 端显示 一个游客进入了聊天室 服务器与客户机连接成功 即可进行聊天 精品文档 5欢迎下载 2 类关系图及描述 精品文档 6欢迎下载 3 程序流程图及描述 服务器端客户端 Socket 函数建立套接字 Blind 函数给套接字指定地址 Accept 函数建立连接 Closesocket 函数关闭套接字 Socket 函数建立套接字 Connect 函数与服务器建立连接 Send 函数和 recv 函数收发数据 Closesocket 函数关闭套接字 建立连接 服务器端创建套接字 socket 指定本地端口 bind 在前面两个函数执行成功 后 服务器已经为服务做好了准备 这时 对于面向连接的服务 调用 listen 函数对指定 的端口实施监听 以探测客户端发来的请求 如果监听到客户端发来的请求 就需要调用 accept 函数来接受请求并建立连接 连接建立后 客户端与服务器端就可以进行数据传输 了 使用 send 函数和 recv 函数来收发数据 套接字使用完毕后调用 closesocket 函数关 闭套接字 客户端与服务器端类似 需要使用 socket 函数创建套接字并指定所使用的协议 使用 send 函数和 recv 函数来收发数据 最后使用 closesocket 函数关闭套接字 与服务器端 不同 客户端不再需要使用 bind 函数指定套接字端口 使用 listen 函数监听客户端的请 求 使用 accept 函数接受客户端请求并建立连接 而是使用 connect 函数向服务器发送连 接请求并建立连接 Listen 函数进行监听 建立连接 从 accept 返回 用于通信的新套接字 Send 函数和 recv 函数收发数据 精品文档 7欢迎下载 4 存储结构 内存分配 主要的存储结构或变量 存储结构 变量 对象类型说明 postinetAddress 标识 IP 地址 portint 标识端口 InitAndListenBool Csever 类成员函数 public InitAndConnetBool Cclient 类成员函数 public DoDataExchangevoid CchatSocketDlg 类成员函数 OnInitDialogbool OnPaintvoid OnQueryDragIconHCURSOR OnInputTextvoid OnServerMessageLRESULT OnClientMessageLRESULT 在 C 中 内存分成 5 个区 他们分别是堆 栈 自由存储区 全局 静态存储区和 常量存储区 栈 就是那些由编译器在需要的时候分配 在不需要的时候自动清除的变量 的存储区 里面的变量通常是局部变量 函数参数等 堆 就是那些由 new 分配的内存块 他们的释放编译器不去管 由我们的应用程序去控制 一般一个 new 就要对应一个 delete 如果程序员没有释放掉 那么在程序结束后 操作系统会自动回收 自由存储区 就是那些由 malloc 等分配的内存块 他和堆是十分相似的 不过它是用 free 来结束自己 的生命的 全局 静态存储区 全局变量和静态变量被分配到同一块内存中 在以前的 C 语 言中 全局变量又分为初始化的和未初始化的 在 C 里面没有这个区分了 他们共同占 用同一块内存区 常量存储区 这是一块比较特殊的存储区 他们里面存放的是常量 不 允许修改 2 3 关键算法分析 算法 1 OnServerMessage LRESULT CChatSocketDlg OnServerMessage WPARAM wParam LPARAM lParam SOCKET socket ts int length i j 精品文档 8欢迎下载 CString str CEdit output NULL char s 1024 int len switch lParam case FD ACCEPT socket accept m server m hSocket NULL NULL m sShow n m sShow 一个游客进入了聊天室 GetDlgItem IDC SHOW SetWindowText m sShow output CEdit GetDlgItem IDC SHOW output LineScroll output GetLineCount m connectionList AddHead socket return 0 case FD READ length m connectionList GetCount for i 0 i length i socket m connectionList GetAt m connectionList FindIndex i if socket wParam len recv socket s 1024 0 s len NULL for j 0 jSetWindowText m sShow CEdit output CEdit GetDlgItem IDC SHOW output LineScroll output GetLineCount return 0 return 0 case FD WRITE return 0 精品文档 9欢迎下载 case FD CLOSE return 0 default m sShow m sShow 客户端发生网络错误 GetDlgItem IDC SHOW SetWindowText m sShow CEdit output CEdit GetDlgItem IDC SHOW output LineScroll output GetLineCount return 0 服务器端消息传输及连接 Accept 接受请求 建立连接 如果连接成功则显示 一个游客进入了聊天室 read 用 于读取消息 包括 send 和 recv 数据传输函数 算法 2 OnClientMessage LRESULT CChatSocketDlg OnClientMessage WPARAM wParam LPARAM lParam CEdit output NULL char s 1024 int len switch lParam case FD CONNECT len GetLastError if len 0 AfxMessageBox 连接失败 else m bInit TRUE m bClient TRUE m sShow 连接成功 n GetDlgItem IDC SHOW SetWindowText m sShow return 0 case FD READ len recv m client m hSocket s 1024 0 s len NULL m sShow s output CEdit GetDlgItem IDC SHOW 精品文档 10欢迎下载 output SetWindowText m sShow output LineScroll output GetLineCount return 0 case FD WRITE return 0 case FD CLOSE return 0 default output CEdit GetDlgItem IDC SHOW output SetWindowText 网络错误 连接失败 closesocket m client m hSocket m bInit false return 0 客户端消息传输及连接 Connect 函数想服务器发送连接请求并建立连接 成功则显示 连接服务器成功 read 用于读取消息 包括 send 和 recv 数据传输函数 2 4 其他 使用多态 不同的对象可以执行相同的动作 但要通过它们自己的实现代码来执行 比如客户端和服务器端均用 send 和 recv 来进行数据传输 3 程序运行结果分析 建立服务器 运行结果如下 精品文档 11欢迎下载 客户端连接服务器 运行结果如下 开始对话 结果如下 精品文档 12欢迎下载 服务器端输入 IP 建立服务器 并把 IP 和端口号提供给客户端 客户端输入 IP 和端口 号 连接服务器 就可以进行聊天了 进行聊天时 数据从下方的文字编辑框中输入 回车键发送消息 聊天结束 可点击退出按钮 如果聊天未结束 服务器首先推出 则在客户端显示网络发 生错误 连接失败 4 总结 4 1 课题的难点和关键点 问题 程序设计完毕后运行时 在一台笔记本上同时运行客户端和服务器端可正常运 行 但在两台笔记本上运行时 两台笔记本 用的无线网 见无法进行聊天 客户端无法 连接到服务器端 解决办法 尝试在机房的两台台式电脑 接网线 上运行 可正常进行聊天 分析原因 无线网是由路由器实现的 需要在路由器上为作为服务器的计算机做一 个端口转发 客户端连接的 IP 地址 实际上是连接的是路由器 但是路由器并不知道这 个请求是给谁的 必须在路由器上做端口转发 不然路由器不会把接收到的请求发给服务 器 4 2 本课题的评价 本程序的不足之处 此程序只是实现了简单的收发消息功能 功能较单一 还有许多 改进提升的地方 1 增加登陆界面 用户通过号码和口令进入系统 对用户身份进行验证 增加系统的安全性 2 可以考虑保存聊天记录功能 方便用户查看 3 界面美化方面 较欠缺 可以更加友好和美观 课题本身 我认为程序设计这门课很有趣 我对这门课很感兴趣 我觉得它对我们以 后的发展很有用 很值得学 但是有一定的难度 并且安排的课时较少 我们在课上学到 的知识有限 需要课下花大量的时间去自学 查资料 但是 由于我们正在处于大二下学 期 课业较紧张 专业课实验课都很多 任务量大 并且正处于各科的期末考试阶段 导 致学习较紧张 时间不够用 给学生的压力很大

温馨提示

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

评论

0/150

提交评论