1、毕业答辩论文基于Linu平台的IM软件基于Linux平台的局域网可语音的IM软件的设计与实 作者:肖亚统 专业:软件工程 指导老师:陈生庆 摘要随着计算机网络的日益普及人们通过网络进行交流显得越来越重要。于是出现了一系列的通信软件。 自1990s四位以色列人推出的ICQ后,IM首次出现,凭借实时在线的交互特性迅速风靡全球。如今,M软件正逐渐成为一个集合了文字、视频、音频业务以及多种增值业务的多媒体网络通信软件,凭借其所具有的廉价性和方便性以及功能不断完善,IM已经和WWW、Email等一起成为网民们最喜爱的网络服务之一。尤其在国内,腾讯QQ普及率远高于Email,在部分中国网民眼中上网基本等价
2、于使用QQ等。2014年4月11日晚间,腾讯QQ同时在线用户数突破2亿。本毕业设计就是模拟QQ聊天软件,开发一个基于Linux平台的局域网实时语音通信软件。系统采用C/S架构,基于Linux平台开发,采用C+编程语言,由服务器端和客户端程序组成,并使用QT进行图形界面的设计。主要实现的是聊天软件的部分功能,即文字聊天、语音聊天、保存用户消息等等功能,主要完成任务包括服务器模块的设计实现、文字聊天、保存用户消息等等功能。通过运行、测试与分析,该功能聊天软件运行稳定、可靠,具有一定的实用价值。关键词:Linux QT 局域网 网络 音频 多线程 IM C/SAbstractAlong with t
3、he high-speed development of the computer network echnology, various of applications based on network was born, like information releasing,data sharing . The development of the LAN is the ame fast. Some governments, enterprises and schools constitute a LAN first, then join into INTERNET. So the inst
4、ant messenger in LAN was borned. This dissertation focuses on the designing and implementation of Communication software on LAN. And a Communication software is built using QT on Linux. First, the Development environment, the Background and the technology are briefly introduced. Then the requirement
5、s analysis and systematic design of a Communication software is discussed in detail. And the implementation details of each function module, is given. Last, using the VM to test the software. Keywords: Linux , QT, LAN, NetWork目录一、前言 课题背景 国内外研究现状及发展趋势 本课题的研究的目的和意义二、 关键技术 Linux操作系统 什么是Linux系统准确的说,是指Li
6、nux的kernel(系统的核心程序),其内核版权属于Linus Torvalds在GPL(GNU General Public License)版权协议下发行, 任何人都可以自由的复制(copy), 修改(change), 套装分发(distribute),销售,但是不可以在分发时加入任何限制, 而且所有原码必须是公开的,所以任何人都可以无偿取得所有执行文件和源代码。 对于Linux用户和系统管理员来,Linux是指包含Linux kernel、utilities (系统工具程序)以及application (应用软件)的一个完整的操作系统。Linux的应用软件是由自由软件基金会(FSF)开
7、发的,全世界许多热心的程序员为Linux开发或移植了很多应用程序,包括X-Windows、Emacs、TCP/IP网络(包括SLIP/PPP/ISDN)等等现在Linux(包括内核和大量的应用程序)光是执行程序就已经达到200M,完全安装后的规模将更大(大约500M左右)。 从本质上讲Linux是Unix的”克隆”或Unix风格的操作系统,在源代码级上兼容绝大部分的Unix标准(如IEEE POSIX),它遵从 POSIX规范,例如对于System V来说,把其上程序源代码拿到 ,Linux下重新编译后就可以运行。 Linux的标志是可爱的企鹅,至于为什么选用企鹅Linus是这样说的,别的都被
8、他人用了企鹅,不是也非常可爱吗?!由Linux作者发布的仅仅是一个内核而己有一些公司或组织把内核、源代码及相关的应用程序组织在一起发行, 于是就产生了不同的Linux发行(distributor)版本, 比较著名的发行版本有RedHat、Ubuntu 、Debian 等。 Linux的发展历史Linux的历史可以追溯到1990年Linus Torvalds还是芬兰赫尔辛基大学的一名学生用汇编语言写了一个在80386保护模式下处理多任务切换的程序。1991年10月5号发布了Linux ,这个版本已经可以运行bash(一种用户与操作系统内核通讯的软件)和gcc(GNU C编译器)了。 Linus从
9、一开始就决定自由扩散Linux、包括源代码他把源代码发布在网上随即就引起爱好者的注意,他们通过互连网也加入了Linux的内核开发工作,一大批高水平程序员的加入,使得Linux达到迅猛发展。到1993年底,Linux 。Linux ,其内核写得紧凑高效,可以充分发挥硬件的性能,在4M内存的80386机器上也非常好。 Linux加入GNU并遵循公共版权许可证(GPL)由于不排斥商家对自由软件进一步开发不排斥在Linux上开发商业软件,故而使Linux又开始了一次飞跃,出现了很多的Linux发行版,如Slackware、Redhat、TurboLinux等十多种,而且还在增加,还有一些公司在Linu
10、x上开发商业软件或把其他Unix平台的软件移植到Linux上来,如今很多IT界的大腕如IBM、Intel、Oracle、Novell等都宣布支持Linux! 商家的加盟弥补了纯自由软件的不足和发展障碍,Linux得以迅速普及。 UbuntuUbuntu是一个以桌面应用为主的Linux操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词(译为友帮拓或乌班图),意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu基于Debian发行版和GNOME桌面环境,与Debian的不同在于它每6个月会发布一个新版本。Ubuntu的目标在于
11、为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。Ubuntu具有庞大的社区力量,用户可以方便地从社区获得帮助。Ubuntu 的版本号是根据其发布版本的日期而定。版本号由该次发布的年份和月份组成,并未反映其实际版本。Ubuntu的首次发布(Warty Warthog)是在2004年10月,。每六个月发布一个新版本,而每两年发布一个长期支持版本(LTS)。 Ubuntu Jaunty Jackalope于2009年4月23日发布,。Ubuntu Karmic Koala,即Ubuntu ,于2009年10月29日发布。前一个长期支持版本(开发代号为Lucid Lynx)
12、于2010年4月发布, LTS。版本Ubuntu ,开发代号:“Oneiric Ocelot”,已经于2011年10月13日发布并提供下载。 (代号Precise Pangolin) 已经于2012年的4月26日发布。 数据库SQLiteSQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比
13、起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月。 至今已经有13个年头,SQLite也迎来了一个版本 SQLite 3已经发布。SQLite是遵守ACID关系型数据库管理系统,它包含在一个相对小的C库中。不像常见的客户-服务器范例,SQLite引擎不是个程序与之通信的独立进程,而是连接到程序中成为它的一个主要部分。所以主要的通信协议是在编程语言内的直接API调用。这在消耗总量、延迟时间和整体简单性上有积极的作用。整个数据库(定义、表、索引和数据本身)都在宿主主机上存储在一个单一的文件中。它的
14、简单的设计是通过在开始一个事务的时候锁定整个数据文件而完成的。 开发语言C+C+程序设计语言是由来自AT&T Bell Laboratories的Bjarne Stroustrup设计和实现的,它兼具Simula语言在组织与设计方面的特性以及适用于系统程序设计的C语言设施。C+最初的版本被称作“带类的(C with Classes)Stroustrup,1980,在1980年被第一次投入使用;当时它只支持系统程序设计和数据抽象技术。支持面向对象程序设计的语言设施在1983年被加入C+之后,面向对象设计方法和面向对象程序设计技术就逐渐进入了C+领域。在1985年,C+第一次投入商业市场Strou
15、strup,1986Stroustrup,1986b。在1987至1989年间支持范型程序设计的语言设施也被加进了C+Ellis,1990Stroustrup,1991。 随着若干独立开发的C+实现产品的出现和广泛应用,正式的C+标准化工作在1990年启动。标准化工作由ANSI(American National Standard Institute)以及后来加入的ISO(International Standards Organization)负责。1998年正式发布了C+语言的国际标准C+,1998。在标准化工作进展期间,标准委员会充当了一个重要的角色,其发布的C+标准之草案在正式标准发布
16、之前,一直被作为过渡标准而存在。 Qt编程软件 Qt是一个1991年由奇趣科技开发的跨平台C+图形用户界面应用程序开发框架。它既可以开发GUI程式,也可用于开发非GUI程式,比如控制台工具和服务器。Qt是面向对象语言,易于扩展,并且允许组件编程。2008年,奇趣科技被诺基亚公司收购,QT也因此成为诺基亚旗下的编程语言工具。在发布Qt 的同时,作为 Qt 开发跨平台IDE的Qt Creator 也发布了更新版本。Qt Creator 和 Qt SDK,包含了开发跨平台应用程序所需的全部功能。Qt Creator是一个用于Qt开发的轻量级跨平台集成开发环境。Qt Creator可带来两大关键益处,
17、提供首个专为支持跨平台开发而设计的集成开发环境 (IDE)并确保首次接触Qt框架的开发人员能迅速上手和操作。Qt Creator包含了一套用于创建和测试基于Qt应用程序的高效工具,包括:一个高级的C+代码编辑器、上下文感知帮助系统、可视化调试器、源代码管理、项目和构建管理工具。Qt ,并且接受代码贡献。 Linux ALSA音频编程 ALSA声音编程介绍 ALSA表示高级Linux声音体系结构(Advanced Linux Sound Architecture)。它由一系列内核驱动,应用程序编译接口(API)以及支持Linux下声音的实用程序组成。这篇文章里,我将简单介绍 ALSA项目的基本框
18、架以及它的软件组成。主要集中介绍PCM接口编程,包括您可以自动实践的程序示例。 您使用ALSA的原因可能就是因为它很新,但它并不是唯一可用的声音API。如果您想完成低级的声音操作,以便能够最大化地控制声音并最大化地提高性能,或者如果您使用其它声音API没有的特性,那么ALSA是很好的选择。如果您已经写了一个音频程序,你可能想要为ALSA声卡驱动添加本地支持。如果您对音频不感兴趣,只是想播放音频文件,那么高级的API将是更好的选择,比如SDL,OpenAL以及那些桌面环境提供的工具集。另外,您只能在有ALSA 支持的Linux环境中使用ALSA。 ALSA历史 ALSA项目发起的起因是Linux
19、下的声卡驱动(OSS/Free drivers)没有得到积极的维护。并且落后于新的声卡技术。Jaroslav Kysela早先写了一个声卡驱动,并由此开始了ALSA项目,随便,更多的开发者加入到开发队伍中,更多的声卡得到支持,API的结构也得到了重组。 ,ALSA被合并到了官方的源码树中。,ALSA已经内建在稳定的内核版本中并将广泛地使用。 数字音频基础 声音由变化的气压组成。它被麦克风这样的转换器转换成电子形式。模/数(ADC)转换器将模拟电压转换成离散的样本值。声音以固定的时间间隔被采样,采样的速率称为采样率。把样本输出到数/模(DAC)转换器,比如扩音器,最后转换成原来的模拟信号。 样本
20、大小以位来表示。样本大小是影响声音被转换成数字信号的精确程度的因素之一。另一个主要的因素是采样率。奈奎斯特(Nyquist)理论中,只要离散系统的奈奎斯特频率高于采样信号的最高频率或带宽,就可以避免混叠现象。 ALSA基础 ALSA由许多声卡的声卡驱动程序组成,同时它也提供一个称为libasound的API库。应用程序开发者应该使用libasound而不是内核中的 ALSA接口。因为libasound提供最高级并且编程方便的编程接口。并且提供一个设备逻辑命名功能,这样开发者甚至不需要知道类似设备文件这样的低层接口。相反,OSS/Free驱动是在内核系统调用级上编程,它要求开发者提供设备文件名并
21、且利用ioctrl来实现相应的功能。 为了向后兼容,ALSA提供内核模块来模拟OSS,这样之前的许多在OSS基础上开发的应用程序不需要任何改动就可以在ALSA上运行。另外,libaoss库也可以模拟OSS,而它不需要内核模块。 ALSA包含插件功能,使用插件可以扩展新的声卡驱动,包括完全用软件实现的虚拟声卡。ALSA提供一系列基于命令行的工具集,比如混音器(mixer),音频文件播放器(aplay),以及控制特定声卡特定属性的工具。 ALSA体系结构 ALSA API可以分解成以下几个主要的接口: 1 控制接口:提供管理声卡注册和请求可用设备的通用功能 2 PCM接口:管理数字音频回放(pla
22、yback)和录音(capture)的接口。本文后续总结重点放在这个接口上,因为它是开发数字音频程序最常用到的接口。 3 Raw MIDI接口:支持MIDI(Musical Instrument Digital Interface),标准的电子乐器。这些API提供对声卡上MIDI总线的访问。这个原始接口基于MIDI事件工作,由程序员负责管理协议以及时间处理。 4 定时器(Timer)接口:为同步音频事件提供对声卡上时间处理硬件的访问。 5 时序器(Sequencer)接口 6 混音器(Mixer)接口 设备命名 API库使用逻辑设备名而不是设备文件。设备名字可以是真实的硬件名字也可以是插件名字
23、。硬件名字使用hw:i,j这样的格式。其中i是卡号,j是这块声卡上的设备号。 第一个声音设备是hw:0,。 插件使用另外的唯一名字,比如 plughw:,表示一个插件,这个插件不提供对硬件设备的访问,而是提供像采样率转换这样的软件特性,硬件本身并不支持这样的特性。 声音缓存和数据传输 每个声卡都有一个硬件缓存区来保存记录下来的样本。当缓存区足够满时,声卡将产生一个中断。内核声卡驱动然后使用直接内存(DMA)访问通道将样本传送到内存中的应用程序缓存区。类似地,对于回放,任何应用程序使用DMA将自己的缓存区数据传送到声卡的硬件缓存区中。这样硬件缓存区是环缓存。也就是说当数据到达缓存区末尾时将重新回
24、到缓存区的起始位置。ALSA维护一个指针来指向硬件缓存以及应用程序缓存区中数据操作的当前位置。从内核外部看,我们只对应用程序的缓存区感兴趣,所以本文只讨论应用程序缓存区。 应用程序缓存区的大小可以通过ALSA库函数调用来控制。缓存区可以很大,一次传输操作可能会导致不可接受的延迟,我们把它称为延时(latency)。为了解决这个问题,ALSA将缓存区拆分成一系列周期(period)(OSS/Free中叫片断fragments).ALSA以period为单元来传送数据。 一个周期(period)存储一些帧(frames)。每一帧包含时间上一个点所抓取的样本。对于立体声设备,一个帧会包含两个信道上的
25、样本。分解过程:一个缓存区分解成周期,然后是帧,然后是样本。左右信道信息被交替地存储在一个帧内。这称为交错 (interleaved)模式。在非交错模式中,一个信道的所有样本数据存储在另外一个信道的数据之后。 Over and Under Run 当一个声卡活动时,数据总是连续地在硬件缓存区和应用程序缓存区间传输。但是也有例外。在录音例子中,如果应用程序读取数据不够快,循环缓存区将会被新的数据覆盖。这种数据的丢失被称为over ,如果应用程序写入数据到缓存区中的速度不够快,缓存区将会饿死。这样的错误被称为under run。在ALSA文档中,有时将这两种情形统称为XRUN。适当地设计应用程序可
26、以最小化XRUN并且可以从中恢复过来。 一个典型的声音程序 使用PCM的程序通常类似下面的伪代码:打开回放或录音接口设置硬件参数(访问模式,数据格式,信道数,采样率,等等)while 有数据要被处理: 读PCM数据(录音) 或 写PCM数据(回放)关闭接口 QT的TCP网络编程TCP即Transmission Control Protocol,传输控制协议。与UDP不同,它是面向连接和数据流的可靠传输协议。也就是说,它能使一台计算机上的数据无差错的发往网络上的其他计算机,所以当要传输大量数据时,我们选用TCP协议。TCP协议的程序使用的是客户端/服务器模式,在Qt中提供了QTcpSocket类
27、来编写客户端程序,使用QTcpServer类编写服务器端程序。我们在服务器端进行端口的监听,一旦发现客户端的连接请求,就会发出newConnection()信号,我们可以关联这个信号到我们自己的槽函数,进行数据的发送。而在客户端,一旦有数据到来就会发出readyRead()信号,我们可以关联此信号,进行数据的接收。 RTP/RTCP协议实时传输协议RTP(Realtime Transport Protocol):是针对Internet上多媒体数据流的一个传输协议, 由IETF(Internet工程任务组)作为RFC1889发布。RTP被定义为在一对一或一对多的传输情况下工作,其目的是提供时间信
28、息和实现流同步。RTP的典型应用建立在UDP(User Datagram Protocol,用户数据包协议)上,但也可以在TCP(Transfer Control Protocol,传输控制协议)或ATM(Asynchronous Transfer Mode,异步传输模式)等其他协议之上工作。RTP本身只保证实时数据的传输,并不能为按顺序传送数据包提供可靠的传送机制,也不提供流量控制或拥塞控制,它依靠RTCP提供这些服务。实时传输控制协议RTCP(Realtime Transport Control Protocol):负责管理传输质量在当前应用进程之间交换控制信息。在RTP会话期间,各参与者
29、周期性地传送RTCP包,包中含有已发送的数据包的数量、丢失的数据包的数量等统计资料,因此,服务器可以利用这些信息动态地改变传输速率,甚至改变有效载荷类型。RTP和RTCP配合使用,能以有效的反馈和最小的开销使传输效率最佳化,故特别适合传送网上的实时数据。三、 系统需求分析 项目总述随着互联网技术的发展,网上办公、网上购物、网上交友等正在以飞快的速度走进大众的生活中,人们可以在网上做在现实生活中做的很多事情,而现实生活中最重要的一件事情就是交流,人与人的交流莫过于口头直接进行交流最为直观最为快捷。在这个“互联网世界”的今天,为了方便内部人员进行实时交流,共同解决工作生活中遇到的困难,为企事业以及
30、其它的局域网用户带来方便此次开发的即时通讯软件可以作为局域网的交流工具使用,通信的安全性不是高,但要求信息的响应速度要较快,让用户充分享受到网络即时消息的方便和快捷。语音聊天是此即时通信系统的一个核心子模块,它采用现代比较流行的网络编程技术,面向各类企事业部门等局域网用户,实现实时语音捕获,音频数据压缩与发送,音频数据接收与回放等功能,从而达到了实时语音通讯的目的,方便内部人员进行实时交流,共同解决工作生活中遇到的困难,为企事业以及其它的局域网用户带来方便。 系统总体需求分析该即时通讯软件由服务器和客户端两部分组成,基于Linux平台开发,采用TCP/IP通信协议,语音模块采用g72a算法压缩
31、,通过RTP/RTCP协议进行网络传输。服务端是可以进行监听,记录客户端请求和验证客户端身份的合法性,并提供消息中转服务;客户端程序面向实际用户,它有必要的界面的按钮,向用户提供网络即时消息的功能。本即时通讯系统包含如下基本功能:1、 客户端:a) 注册用户b) 用户登录c) 获取好友列表并显示好友状态d) 文字聊天e) 语音聊天f) 查看和修改用户信息g) 连接服务器2、 服务端a) 启动和停止服务器b) 接收和回应客户端c) 转发用户之间的消息四、 系统总体设计 总体架构正如前面所述,系统整体采用C/S架构模式,但具体实现细节,本系统是基于C/S模式下的三层体系架构,即系统可以划为三层,分
32、别对应于数据库服务层、聊天服务层、客户层。其中数据库服务层的主要工作是为聊天服务层提供数据存储秘查询的接口,并按设计的策略对数据进行管理。聊天服务层的主要作用是提供与客户端的交互式接口,为其提供用户登录、注册、注销、聊天消息转等服务。另外聊天服务层还有一个作用,是借助于数据库服务层的接口,进行数据的可靠性存储与查询。客户层的主要作用是为用户提供服务的操作接口,包括用户登录、用户注册、用户聊天等服务。客户层主要与聊天服务层进行交互。系统部署架构如下图:上图是在宏观层面上,展示了系统部署的场景,下面将从微观层面入手,具体信息的流转与处理入手,从每个功能的角度,讲述系统的各个层是如何参与的。1. 登
33、录功能2. 注册功能3. 文本聊天功能4. 语音聊天功能5. 添加删除好友功能 服务器设计 服务器设计原理在总体架构设计上,对聊天服务层的功能进行了界定,依照功能,聊天服务层(下面简称服务器端)的信息主要步骤如下。(1) 接收用户请求信息(2) 解析用户请求信息,根据不同的请求信息,执行对应的处理,并返回给客户端相应的回应消息(3) 向数据库中存入相应的信息每个用户的请求,都会涉及到以上3个步骤,因此可以采用串行化的处理方式。 服务器端的模块根据上面的描述,服务端可以被划成一个若干模块。而各个模块的定义如下所示:(1) 数据接收与回应模块(2) 业务服务模块业务服务模块是具体的服务模块,它由若
34、干个子模块,包括登录子模块、注册子模块、文本聊天模块、语音聊天模块、添加好友子模块等。(3) 数据写入模块数据写入模块对应 客户端设计客户端是采用QT进行可视化的设计,客户端聊天服务器进行交互,也是采用TCP的方式进行通信,它也是由具体的业务模块组成的。具体的业务模块分为如下几类:1. 登录模块2. 注册模块3. 文本聊天模块4. 语音聊天模块5. 添加删除好友模块6. 数据接收模块7. 其他辅助模块 通信协议设计在C/S网络程序设计中,一个重要的工作是通信协议的设计,一个良好的、可扩展的通信协议是C/S项目成功的基础。当前有很多种方式设计通信协议。例如,可以采用XML格式、Json格式,以及
35、类似TCP/IP数据报文的格式。在本项目中采用的是第三种方式,按数据包的方式设计通信协议。通过前面的需求分析可以得知,系统本身通信协议要涉及到登录、注册、文本聊天、语音聊天、退出等情况。 数据库表设计在本系统中涉及到3张表的设计,分别为用户信息表、好友表、临时信息表,其中用户信息表的作用是保存已注册用户的基本信息,用于处理用户的登录、注册、状态;好友表用于记录用户之间的好友关系;临时信息表用于记录信息类型、发送者、接收者、文本聊天信息。在这三张表的设计如下所示。(1) 用户信息表字段名字段类型是否为主键默认为空account五、 系统详细设计 服务器详细设计 客户端详细设计 连接服务器 注册模块 登录模块 添加删除好友模块 文本聊天模块 语音聊天模块 数据库详细设计六、 总论