第 2 章 系统分析及开发技术说明
2.1 节 需求分析
2.1.1 节 功能需求分析
图 2.1 功能需求说明图
(1)用户端的基本聊天信息发送,这些基本聊天信息包括文本和图片。文本和
图片聊天是聊天软件最基础的功能。用户通过输入 IP 来查找用户,并申请加为好友,
在对方同意加为好友后,在线用户列表就会更新用户,把加入的用户添加到用户列
表中。这样,两个用户之前就可以实现通信了。在信息传输中,预计利用 TCP/IP 协
议中的 UDP 协议,这是面向无连接的协议,但发送速度快,用于聊天信息传输用适
合。
(2)用户端的音视频数据传输,这是本设计的扩展功能。用户可以正常通信后,
就可以选择是否进行语音或视频聊天。本功能也将采用 UDP 协议,UDP 协议可能会
丢失数据,但对于音视频聊天需要传输大量数据但又允许丢失少量数据的情况下 ,
UDP 的快速发送信息的特点就得到很好的体现。
(3)用户端文件传输的功能,用户之间可以断点续传文件。在传文件之前,首
先创建一信息文件,记录文件传送的一些信息,并根据传输的数据量实时修改。如
果没有传完,下次就可以继续打开这个信息文件,接着上次的进度传输。因为文件
传输入要求数据不能出错,因此此模块采用 TCP 协议。
(4)用户端之间白板和共享屏幕的功能,这个功能有些类似视频的传输,因些
1
功能需求
发送基本
聊天信息
传输音视
频数据
传输文
件
白板 共享屏
幕
保持连接
发送文本
信息
发送图片
信息
并不是很难,可以在视频传输的功能上加以修改。
(5)用户之间后台的连接,每个用户隔指定时间会向用户列表中的每一用户发
送消息,查看用户是否在线,如果不在线,就更新用户列表,删除用户。
2.1.2 节 数据需求分析
(1)客户端之间聊天信息。在控件上显示时格式化,更易于用户的查看自己发
送或接收到的信息。
(2)在线用户列表信息。服务器端存放在适当的空间中,在发送给客户端时,
对信息列表进行格式化,便于客户端提取信息。
(3)客户端向服务器端发送的确认在线信息。包括客户端刚刚启动时的初始化
信息和在使用过程中的确认在线信息。
(4)其它程序内部可能需要设计的数据结构体。
2.1.3 节 性能需求分析
(1)可靠性高,能在由于系统问题或其它原因产生错误后,作出相对应处理,
比如网络初始化失败、服务器不在线等,可以提示用户安全退出本程序,在出现不
可知的错误以后,可以尽量安全的退出程序。在程序的设计过程中,要求能尽可能
多的设想到用户使用过程中可能发生的事件,并能在判断事件后做出相应的处理,
使程序具有较高的容错性能。
(2)宜操作性,程序简单易懂,容易上手使用。设计界面是,简化界面的复杂
性,模拟 QQ 等现有即时通讯工具的界面,使用户能很容易看懂并使用。
(3)开发文档易理解,保证以后自己二次开发或他人接手开发时,能够清晰的
理解整个系统的设计思路和实现细节。
(4)模块化设计此软件的功能,不同的模块实现不同的功能,使得软件易于以
后的维护与扩展,在以后可以更好的完善本软件的功能,更方便于在工作中的应用。
2.1.4 节 运行需求分析
(1)用户界面
程序较小,启动速度快,无启动界面。在本地局域网中使用,所以无需进行用
户登录,无需认证界面,启动后的应用界面要清爽,设计要简单明了,要具有较高
的易用性。
(2)故障处理
在遇到可预知的故障与情况时,能提示用户并自动退出;在遇到不可预知的故
障时能安全退出。
2
2.4 节 Winsock 网络编程
Windows Sockets 是从 Berkeley Sockets 扩展而来的,其在继承 Berkeley Sockets
的基础上,又进行了新的扩充。这些扩充主要是提供了一些异步函数,并增加了符
合 WINDOWS 消息驱动特性的网络事件异步选择机制
[5]
。
Windows Sockets 由两部分组成:开发组件和运行组件。
开发组件:Windows Sockets 实现文档、应用程序接口(API)引入库和一些头文件。
运行组件:Windows Sockets 应用程序接口的动态链接库(WINSOCK.DLL)。
2.4.1 节 Socket
套接字(Socket)最初是由加利福尼亚大学 Berkeley 分校为 UNIX 操作系统开发
的网络通信接口,随着 UNIX 操作系统的广泛使用,套接字成为当前最流行的网络
通信应用程序接口之一
[7]
。90 年代初,由 Sun Microsystems,JSB Corporation,FTP
software , Microdyne 和 Microsoft 等 几家 公司 共同 制定 了一 套标准,即 Windows
Sockets 规范。
Windows Sockets API 是 Microsoft Windows 的网络程序设计接口,它在继承了
Berkeley Sockets 主要特征的基础上,又对它进行了重要扩充。这些扩充主要是提供
了一些异步函数,并增加了符合 Windows 消息驱动特性的网络事件异步选择机制。
这些 扩 充 有 利于 应 用 程序 开 发 者 编 制符 合 Windows 编 程 模式 的 软 件,它 使 在
Windows 下开发高性能的网络通信程序成为可能。
Socket 实际上是指一个通信端点,借助于它,用户所开发的 Socket 应用程序,
可以通过网络与其它 Socket 应用程序进行通信。
近年来,随着计算机网络与 Windows 95 的流行,许多用户所开发的应用程序需
要实现网络间的数据通信。
2.4.2 节 开发 Windows Sockets 网络通信程序的软、硬件环
境
所采用的操作系统软件可以是 Windows 95,2000,XP,也可以是 Windows NT,因
为它们都支持 Windows Sockets API,在以下的介绍中,我们将以在 Windows XP 环
境下的开发为例。
所采用的编程语言一般可选目前较流行使用的可视化和采用面向对象技术的
Microsoft Visual C++ 6.0。Visual C++ 6.0 可在 Windows XP 或 Windows NT 环境下运
行,其开发系统增加了全面集成的基于 Windows 的开发工具以及一个基于传统 C/C+
+ 开 发 过 程 的 “ 可 视 化 ” 用 户 界 面 驱 动 模 型 。 Visual C++ 6.0 中 的 Microsoft 基 类
3
(MFC,即 Microsoft Foundation Class)库是一系列 C++类,其中封装着为 Microsoft
Windows 操作系统系列编写应用程序的各种功能 。在有关套接字方面,Visual C++
6.0 对 原 来 的 Windows Sockets 库 函 数 进 行 了 一 系 列 封 装 , 继 而 产 生 了 CSocket
、CSocketFile 等类,它们封装着有关 Socket 的各种功能
[8]
。
所采用的网络通信协议一般是 TCP / IP。Windows XP 和 Windows NT 都带有该
协议。但是,所开发的网络通信应用程序并不能直接与 TCP / IP 核心打交道,而是
与网络应用编程界面 Windows Sockets API 打交道。Windows Sockets API 则可直接与
TCP/IP 核心进行沟通。TCP / IP 核心协议连同网络物理介质(如网卡)一起,都是
提供网络应用程序间相互通信的设施。
2.4.3 节 CSocket 类编程模型
使用 CSocket 对象涉及 CArchive 和 CSocketFile 类对象。以下介绍的针对字节流
型套接字的操作步骤中,只有第三步对于客户方和服务方操作是不同的,其他步骤
都相同
[13]
。
(1)构造一个 CSocket 对象。
(2)使用这个对象的 Create()成员函数产生一个 socket 对象。在客户方程序中,
除非需要数据报套接字,Create()函数一般情况下应该使用默认参数。而对于服务方
程序,必须在调用 Create 时指定一个端口。需要注意的是,Carchive 类对象不能与数
据报(UDP)套接字一起工作,因此对于数据报套接字,CAsyncSocket 和 CSocket
的使用方法是一样的。
(3)如果是客户方套接字,则调用 CAsyncSocket ∷Connect()函数与服务方套接
字连接;如果是服务方套接字,则调用 CAsyncSocket∷Listen()开始监听来自客户方
的连接请求,收到连接请求后,调用 CAsyncSocket∷Accept()函数接受请求,建立连
接。请注意 Accept()成员函数需要一个新的并且为空的 CSocket 对象作为它的参数,
解释同上。
(4)产生一个 CSocketFile 对象,并把它与 CSocket 对象关联起来。
(5)为接收和发送数据各产生一个 CArchive 对象,把它们与 CSocketFile 对象
关联起来。切记 CArchive 是不能和数据报套接字一起工作的。
(6)使用 CArchive 对象的 Read()、Write()等函数在客户与服务方传送数据。
(7)通讯完毕后,销毁 CArchive、CSocketFile 和 CSocket 对象。
2.4.4 节 用 VC6.0 进行 Windows Sockets 程序开发的技术
要点
(1)同常规编程一样,无论服务器方还是客户方应用程序都要进行所谓的初始
化处理,这部分工作仍可采用消息驱动机制来先期完成。
(2)一般情况下,网络通信程序是某应用程序中的一模块。在单独调试网络通
信程序时,要尽量与采用该通信模块的其它应用程序开发者约定好,统一采用一种
界面形式,即单文档界面 SDI、多文档界面 MDI 和基于对话框界面中的一种(这在
4
使用 AppWizard 形成项目[Project]文件时有提示),尽管这并非必须,但可使通信模
块在移植到所需的应用程序时省时省力,因为 Visual C++ 6.0 这种可视化语言在给我
们提供方便的同时,也给我们带来某些不便,譬如所形成的项目文件中的许多相关
文件与所采用的界面形式密切联系,许多消息驱动功能,随所采用的界面形式不同
而各异。 当然,也可将通信模块函数化,并形成一个动态连接库文件(DLL 文件),
供主程序调用。
(3)以通信程序作为其中一个模块的应用程序往往不是在等待数据发送或接收
完之后再做其它工作,因而在主程序中要采用多线程(Multithreaded)技术。即将数
据的发或收,放在一个具有一定优先级(一般宜取较高优先级)的辅助线程中,在
数据发或收期间,主程序仍可进行其它工作,譬如利用上一个周期收到的数据绘制
曲线 。Visual C++ 6.0 中的 MFC 提供了许多有关启动线程、管理线程、同步化线程、
终止线程等功能函数
[14]
。
(4)在许多情况下,要求通信模块应实时地收、发数据。譬如调用之的主程序
以 0.5 秒为一周期,在这段时间内 ,要进行如下工作:接收数据,利用收到的数据
进行 运算,将运 算结 果发 送到 其它计 算机节点,周 而复 始。 我们 在充 分利用
Windows Sockets 的基于消息的网络事件异步选择机制,用消息来驱动数据的发送和
接收的基础上,结合使用其他措施,如将数据的收和发放在高优先级线程,在软件
设计上,安排好时序,尽量避免在同一时间内,双方都在向对方发送大量数据的情
况发生,保证网络要有足够的带宽等,成功地实现了数据传输的实时性
[2]
。
5