聊天系统设计与实现本科毕业论文(编辑修改稿)内容摘要:

同意连接,则返回给客户端同意信号,开启服务器的接收信息线程,并置消息发送事件为 Enable。 客户端收到服务器返回的同意信号后,也开启接收信息线程,并置消息发送事件为 Enable。 通信双方就可以进行文字聊天了。 若服务器端拒绝客户端的连接,则关闭 tcpconnect,并关闭网络流,继续执行监听。 客户端得知服务器端关闭 tcpconnect并关闭网络流之后,则释放本次 socket和网络流。 若已建立连接,当断开连接时,将向对方发送断开信号,然后将释放 Socket和网络流,不影响到下一次连接的接入。 文本聊天服务器工作流程如图 6所示。 图 6文本聊天服务器程序流程图 连接服务器 服务器同意连接。 否 是 建立连接,允许发送消息事件, 启动接受信息线程 进行文字消息通信 开始 是 客户端接收消息 发送断开信号,关闭文本聊天 否 终止 停止接收 主 ip 关闭端口 是 否 山西大学商务学院本科毕业设计 10 文本聊天客户端工作原理 客户端用来向服务器端发起一个连接,等待服务器的允许接入 确认。 若服务器端同意连接请求,接收到服务器的同意连接信号后,开启接收信息线程,并置消息发送事件为 Enable,通信双方就可以进行文本聊天了。 若已建立连接,当断开连接时,将向对方发送断开信号,然后将释放Socket和网络流,不影响到下一次连接的发起。 P2P文本聊天 1) 功能概述 将文本聊天客户端和服务器模块,通过多线程技术,集成在一个聊天窗体里面,窗体加载时进行监听,有连接请求到达,则为服务器端;试图连接远程用户,则为客户端。 它是建立在TcpListener以及 TcpClient这两个类基础上 的。 程序实现的原理也比较简单,但是用到了 P2P技术 非中心化 的基本原则。 简言之,用这个程序可以在网络中发送、接受消息,任何一台计算机既可以作为服务器端,又可以作为客户端。 2) 集成文本聊天工作流程图 集成主窗体创建后,加载监听线程。 当 有接入连接请求,同意或拒绝接入请求,若同意,则按照文本聊天服务器模块工作流程执行。 当无接入请求,则判断是否有尝试连接远程服务端事件,若有,则按照文本聊天客户端模块工作流程执行,如图 7所示。 基于 C++的 FeiQ的山西达内公司局域网聊天系统设计与实现 11 图 7 P2P文本聊天程序流程图 3) 集成主窗体设计 主窗体是用来与用户交互用的,所以加载时间不能太长,响应速度应足够快,操作简单,设计人性化。 所以,设计的时候,采用了一些通俗易懂的图片和按钮。 当用户未输入文字而尝试发执行监听线程,监听端口 是 否 开始 有接入连接请求 是 是 否 否 连接服务器。 是 否 是否成功建立 开连接。 连接双方进行消息通信 是 终止 结束聊天 否 断开连接。 发送断开信号,关闭文本聊天 是 本地或远程服务端允许。 建立连接,信息线程 山西大学商务学院本科毕业设计 12 送时,弹出消息提示框,提示不能发送空信息,节省系统和网络资源。 表 1 文本聊天窗体主要控件属性表 控件 属性 值 GroupBox Name groupbox1 Text 信息显示 RichTextBox Name richTxtInfos Readonly TRUE RichTextBox Name richTxtSent Readonly FALSE Active KeyDown Button Name send Text 发送消息 Button Name clearbox Text 清除屏幕 Button Name savelog Text 消息记录 4) 具体实现 定义相关变量。 集成主窗体创建后,创建一个 tcpListener的对象,端口为 4000, IP为任意。 创建监听线程 wait, wait线程执行的是 waitconn()方法, 启动监听线程。 调用 getMyIP()方法用于获取本地 IP地址,并在连接建立时传给对方。 当 wait线程监听到远程用户的接入连接请求,弹出消息提示框,用户可以选择同意或拒绝接入请求。 若同意,则创建 接 收 信息线程 th,并 启动 th。 若用户拒绝远程接入请求,则关闭网络流 nss,关闭 tcps,并调用 disconnect()重新初始化相关变量。 接收信息时,尝试读取网络流,采用的是 Unicode编码。 读取到的消息如果不为断开连接信号,则在聊 天记录框里面显示出来;若为断开信号,则执行 disconnect()方法关闭当前连接。 当无接入请求,则判断用户是否有尝试连接远程服务端事件。 若有,创建 TcpClient的对象 tcpc,并尝试连接远程主机。 连接建立后,用户单击“发送消息”按钮或者在输入文本框内按热键“ Alt+S”或“ Ctrl+Enter”,触发 send_Click 事件。 send_Click 事件主要是将用户的输入通过 Socket,采用网络流的形式传输给远程用户,编码采用 Unicode,同时在聊天记录框里面显示出来。 断开连接或关 闭窗体,需要将 Socket、网络流以及接收信息线程 th进行关闭,重置各按钮的可用状态。 若是关闭窗体,还需将 wait线程关闭。 语音传输模块实现 语音传输模块概述 除了文本聊天以外,局域网内另外一个应用是语音传输。 出于可靠性和效率考虑,本模块也采用 TCP协议来进行用户之间文件的传输。 基于 C++的 FeiQ的山西达内公司局域网聊天系统设计与实现 13 文件传输接收端工作原理 语音实时传输是语音聊天软件的核心技术。 文中在分析语音实时传输原理的前提下,探讨了局域网语音实时传输的设备的初始化、内存分配、语音录制、播故和传输等具体方法,并以C++Builder6. 0提供的控件为基础,以 API函数给为工具,给出了局域网实时语音聊天的具体实例,实现了局域网聊天。 如图 8所示。 图 8 语音传输接收端程序流程图 语音传输发送端工作原理 开启窗体后,发送端选择用户需要发送的文件,向接收端发起的文件传输请求,若接收端端同意接收,开启计时器,将本地文件通过网络发送给接收端,并在文件传输过程中对文件传输状态进行反馈,文件发送完毕,关闭计时器,关闭文件流,并在状态栏上 显示出完毕状态。 若接收端拒绝接受文件,则取消本次文件发送,等待用户的下一次文件发送事件。 文件传输发送端工作流程图如图 9所示。 执行监听线程 同意接收文件。 否 是 发送同意接收信号,启动计时器,接收文件流,反馈状态 终止 接收发送端的 语音 文件传入请求 关闭 语音 文件流 将远程文件存储至本地文件 开始 发送拒绝信号 山西大学商务学院本科毕业设计 14 图 9 文字传输发送端程序流程图 P2P文字传输 1) 功能概述 将聊天内容发送端和接收端模块,通过多线程技术,集成在聊天窗体里面,窗体加载时进行监听,有文件传输请求到达,则为接收端,执行接收端工作流程;若试图发送信息到远程用户,则为发送端,执行发送端工作流程。 这样就 实现了 P2P模式对等传输。 2) P2P文字传输工作流程图 负责接收信息的监听线程集成在聊天窗体内,当聊天窗体加载时,将开启此线程。 当有信息传入请求,用户可以同意或者拒绝接收,若同意接收,则按照信息传输接收端模块工作流程执行。 若在聊天窗体生存周期内,无接入连接请求,则判断是否有用户尝试发送文件事件,若有,则按照信息传输发送端模块工作流程执行。 P2P文字传输工作流程图如 图 10所示。 添加待传送的 信息 接收端同意接收 信息。 否 是 启动计时器,发送文 字 流,反馈状态 终止 向接收端发送 信息 传输请求 关闭计时器,关闭 信息 流 将本地 信息 发送至接收端 开始 基于 C++的 FeiQ的山西达内公司局域网聊天系统设计与实现 15 图 10 P2P文字传输 程 序 流程图 3) 语音文件传输发送端窗体 文件发送主要作用是发送本地文件至远程接收端,所以功能尽可能简单化,方便用户操作,设计人性化。 设计的时候,采用了一些简单按钮,布局也和常用的窗体类似。 语音文件传输窗体主要控件属性见表 2。 表 2 文件传输窗体主要控件属性 控件 属性 值 TextBox Name txtFile Button Name btnBrowse Text 浏览 ... Button Name btnStart 否 执行监听线程,监听端口 是 否 启动计时器,接收 信息流 ,显示 内容 接收状态信息 终止 收到信息 开始 是 是 否 接收端允许。 启动计时器,发送 信息 流,显示 内容 发送状态信息 将本地文件发送至接收端 发送 文字。 否 是 有文 字 传 入请求 允许接收。 山西大学商务学院本科毕业设计 16 Text 开始 Button Name btnCancel Text 取消 Label Name lblStatus OpenFileDialog Name dlgOpenFile 4)具体实现 定义相关变量。 主窗体加载时,创建文件接收监听线程 ReceiverWorker,并启动 ReceiverWorker线程。 ReceiverWorker 线程执行的是 ReceiverStart()方法。 在 ReceiverStart()中,创建一个TcpListener的实例 tcpListener,其监听局域网内的任意 IP地址在 8088端口号上是否有传入的连接尝试。 当 ReceiverWorker线程监听到远程用户的文件传入请求,弹出消息提示框,用户可以选择同意或拒绝文件传入请求。 若同意,用户选择文件保存路径后,向发起方发送同意接受信号,并开启计时器,文件接收完毕时关闭计时器。 若用户拒绝文件传入,则向远程主机发送一个拒绝信号。 最后,执行关闭 BinaryReader,关闭 Socket等操作。 当用户打开语音文件发送窗体,主窗体调用其带 ip参数的构造方法,实参为当前与之建立连接的远程主机的 ip地址,用于发送文件时建立 socket连接使用。 用户单击“语音”按钮,开启 用于向远端发送文件的 SenderWorker线程。 SenderWorker线程执行 SenderStart()方法。 SenderStart()方法将创建一个 TcpClient的实例 tcpClient,尝试连接指定的 ip地址的 8088端口,将文件的信息发送给远程主机并等待远程主机的确认。 若接收方同意接收文件,则启动计时器并打开 BinaryWriter,将本地语音文件发送给远程主机,若远程主机拒绝接收,则关闭此次 socket 连接,等待下一次文件发送事件的触发。 用户管理模块实现 用户管理模块概 述 不管是任何系统,都必然会有用户这个角色,因此用户管理是每一个应用中必不可少的部分。 由于 企业内部的信息越来越私密,企业只希望员工通过内部局域网进行沟通与交流,所以 在本局域网聊天工具中,设计一个简单用户管理模块,对接入服务器的用户进行管理,能在一定程度上解决安全性问题。 本模块实现采用了 xml技术,二次开发时,通过一定的修改,能够很好的移植到数据库上。 用户数据模型 本模块实现一个简单的用户管理,所管理的目标是局域网内客户端用户。 模块中只涉及到用户一个模型,涉及到的属性项目有 用户 ID、 用户 名 (姓名 )、 密码 、 注册时间 等,其 ER图如图 59所示。 XML文档结构设计 XML分为文件序言( Prolog)和文件主体两个大的部分。 在此文件中的第一行即是文件序言。 它主要是告诉 XML 解。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。