LINUX平台下的聊天软件的设计与开发—免费毕业设计论文_第1页
LINUX平台下的聊天软件的设计与开发—免费毕业设计论文_第2页
LINUX平台下的聊天软件的设计与开发—免费毕业设计论文_第3页
LINUX平台下的聊天软件的设计与开发—免费毕业设计论文_第4页
LINUX平台下的聊天软件的设计与开发—免费毕业设计论文_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

1、毕业设计(论文)Linux平台下的聊天软件的设计与开发论文作者姓名:申请学位专业:申请学位类别:指导教师姓名(职称):论文提交日期:Linux平台下的聊天软件的设计与开发摘 要如今互联网技术高度发达,网络聊天软件作为一种开销低且方便快捷的通讯手段,被越来越多的人所使用。本文阐述了如何使用GTK+图形开发库和C语言编写一个基于Linux平台运行的聊天软件的过程。文章主要分为四个部分,第一部分主要分析了该类产品的一个发展过程和开发此类软件的背景及意义。在此基础上,进一步的分析了该类产品的需求情况。在第三章中详细的介绍了所选取的开发环境,通过了解这些知识将会对该类软件的开发流程有一个总体的认识。之后

2、,在通过对预备方案的分析和总结后,最终确定设计路线。程序设计路线这一章节对该软件的各个功能模块和操作处理流程进行了详细的划分和设计,并且运用各种图表清晰的展现了软件的模块信息和总体结构。软件的预期效果在这一章节中得到了体现,完成效果符合前期的需求分析。最后总结了该软件开发的不足之处,还有软件需要完善的部分。关键词:Linux系统;C/S结构;TCP/IP协议;网络编程;图形用户界面Design and Implementation of Chat Software on the Platform of Linux Operating SystemAbstractNowadays the net

3、work technology develops very rapidly, the chat program as a cheap and quick means of communication has been adopted by more and more people in the world.This disquisition expounds how to use the GTK+ and C cord a chat program based on the Linux platform, and the paper is divided into four parts. Th

4、e first part is to deal with the development of this product and the background and significance of developing of this software. On this basis it goes on to describe the demand for this product. The third part introduces the choice about the circumstance of this development. With such knowledge in h

5、and, we have a general idea of the developing program of this software. And the design idea will be determined through the analysis and summing-up of the preparatory design.In the section dealing with the program design, all the function modes and their operation flow of this software give an accoun

6、t of the detailed division and design. In addition, all the charts show the information of the modes and their whole structures. Finally, the paper points out the shortcomings in the design of the software. And it is hoped that further efforts will be made in the design.Key words: Linux Operating Sy

7、stem; Client/Server Model; TCP/IP Protocol; Network Programming; Graphics User Interface目 录论文页数:26页1引言11.1课题的背景及意义11.2网络聊天软件的发展及现状11.3TCP/IP协议简介21.3.1TCP协议简介21.3.2UDP协议简介21.4套接字简介31.5开发平台简介31.5.1Linux系统简介31.5.2Gtk+图形开发库简介41.5.3Gnome的开发结构简介41.5.4Glade集成开发工具简介41.5.5编程语言和编程工具简介51.6本章小结52软件需求分析52.1软件功能需

8、求52.2总体性能需求62.2.1服务器端性能需求62.2.2客户端性能需求62.3错误处理需求62.4本章小结63程序设计方案63.1方案比较63.1.1采用TCP方式连接63.1.2采用UDP方式连接73.2方案选择83.3总体设计方案83.3.1服务器功能模块划分83.3.2客户端功能模块划分83.3.3消息标识的定义93.3.4消息结构体的设计104软件流程114.1服务器消息处理流程114.2客户端操作流程124.3客户端消息发送和接收流程134.4申请用户流程145详细设计155.1服务器主要函数和变量155.2服务器消息处理模块的设计与实现155.3服务器数据存储的方法165.4

9、客户端主要窗口设计175.5客户端主要函数和变量205.6客户端功能模块的设计与实现215.7本章小结23结 论23参考文献24致 谢25声 明261 引言1.1 课题的背景及意义在网络无所不在的今天,在Internet上,有ICQ、MSN、Gtalk、OICQ等网络聊天软件,极大程度上方便了处于在世界各地的友人之间的相互联系,也使世界好像一下子缩小了,不管你在哪里,只要你上了网,打开这些软件,就可以给你的朋友发送信息,不管对方是否也同时在线,只要知道他有号码。Linux 操作系统作为一个开源的操作系统被越来越多的人所应用,它的好处在于操作系统源代码的公开化!只要是基于GNU公约的软件你都可以

10、任意使用并修改它的源代码。但对很多习惯于Windows操作系统的人来说,Linux的操作不够人性化、交互界面不够美观,这给Linux操作系统的普及带来了很大的阻碍。因此制作一个Linux 操作系统下的拥有人性化界面的实时通讯工具,将给那些刚刚接触Linux操作系统的用户带来极大的方便,而且通过设计这样的一个应用程序还能更好的学习网络编程知识和掌握Linux平台上应用程序设计开发的过程,将大学四年所学知识综合运用,以达到检验学习成果的目的。1.2 网络聊天软件的发展及现状网络的诞生从某种意义上来说改变了我们的生活,它将这个世界的上不同地域的人之间的距离拉近了。伴随着网络的诞生,网络聊天软件也随之

11、而来。最初的网络聊天软件只是有简单的文本界面,功能也十分有限,随着技术的不断发展与强大,拥有更多功能和美观界面的聊天程序走进了我们的生活,也有越来越多的人将网络聊天软件作为他们日常生活交流和通信的工具。网络聊天软件在国外有ICQ等,在国内主要有OICQ、Ticq和一些基于网页的即时通讯工具,像Chinaren网站上的WebMaster等等,都做得即美观,且功能强大,OICQ现在拥有非常大的用户群。现在也有很多在网络上不使用服务器的通讯软件,这种软件小巧且方便,也能解决一部分问题。但是有服务器的通讯软件,有着不可比拟的优势:可以发送离线消息,不管用户当时是否在线,下次上线时,就可以看到这条消息了

12、。可以保存用户的个人信息或个人简介,供人查看。而且,无服务器的通讯软件,是以机器为通讯单元的,而有服务器的聊天软件是以人为通讯单元的。所以,带服务器的聊天软件在网络上,有着非常广泛的用途,为网络上的通讯带来了极大的方便,它使人与人之间的交流不再只局限于某一个范围,并且它的开销也是很小的,你只需要拥有一部可以联网的PC机就足够了!1.3 TCP/IP协议简介TCP/IP是国际互联网所采用进行网际互连的通信协议。实际所称的TCP/IP协议包括了在国际互联网络应用的一组协议,互联网协议族是此协议族的另一个名字。1.3.1 TCP协议简介因为我们这个程序所采用的是面向连接的TCP协议,所以我们这里就只

13、对TCP(传输控制协议)这一部分作详细的介绍。TCP:传输控制协议(TCP:Transmission Control Protocol)传输控制协议是一个 TCP/IP 组中能够实现可靠数据传送的传输层协议,并通过顺序响应能实现对应用程序的虚拟连接服务,在必要的时候进行包转发。与 IP 协议相结合,TCP 代表了网络协议的核心。大多数网络应用程序是在相同的机器上运行的,计算机上必须能确保目的地的应用程序从源地址处获得数据包,及源计算机上的应用程序的回复获得选择的路经。这一过程是通过使用 TCP 的“端口号”完成的。网络IP地址和端口号的连接要达到唯一的标识,我们称之为“套接字”或“端点”。为了

14、可靠通信,TCP 在端点间建立了连接或虚拟电路。TCP 服务提供了数据流传输、可靠行、有效流控制、全双工操作和多路复用技术等。关于数据流传输,TCP 发送一个由序列号定义的无结构的字节流。这对应用程序有利,因为在被送出 TCP 之前应用程序不需要划分成块,TCP 可以将字节整合成字段,然后发送给IP。TCP 是面向连接的端到端的可靠协议,并保证传送数据包的顺序,而顺序是用一个响应序号来保证的,这个响应序号告诉接收者发送者期望的下一个包。如果在规定时间内,没有收到关于这个包的确认响应,则需要重新发送此包。TCP 的可靠机制允许设备处理丢失、删除及读错的包。暂停机制允许设备监测丢失的包并请求重发。

15、TCP 提供了有效流控制。当向发送者返回发送确认响应,接收 TCP 进程就会暗示最高序列号,它能接收并保证不会发生溢出。全双工操作:TCP 进程能够同时发送和接收包。TCP 中的多路技术:大量上层同时会话在单连接时进行多路复用。1.3.2 UDP协议简介UDP协议是英文User Datagram Protocol的缩写,即用户数据报协议,主要用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天,UDP仍然不失为一项非常实用

16、和可行的网络传输层协议。与我们所熟知的TCP(传输控制协议)协议一样,UDP协议直接位于IP(网际协议)协议的顶层。根据OSI(开放系统互连)参考模型,UDP和TCP都属于传输层协议。UDP协议的主要作用是将网络数据流量压缩成数据报的形式。一个典型的数据报就是一个二进制数据的传输单位。每一个数据报的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。既然UDP是一种不可靠的网络协议,那么还有什么使用价值或必要呢?其实不然,在有些情况下UDP协议可能会变得非常有用。因为UDP具有TCP所望尘莫及的速度优势。虽然TCP协议中植入了各种安全保障功能,但是在实际执行的过程中会占用大量的系统开

17、销,无疑使速度受到严重的影响。反观UDP由于排除了信息可靠传递机制,将安全和排序等功能移交给上层应用来完成,极大降低了执行时间,使速度得到了保证。1.4 套接字简介应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCPIP协议交互提供了称为套接字(Socket)的接口。 区分不同应用程序进程间的网络通信和连接,套接字主要有3个参数:通信的目的IP地址、使用的传输层协议(TCP或UDP)和使用的端口号。通过将这3个

18、参数结合起来,与一个Socket绑定,应用层就可以和传输层通过套接字接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务1.5 开发平台简介1.5.1 Linux系统简介Linux 操作系统是UNIX 操作系统的一种克隆系统。它诞生于1991 年的10 月5 日(这是第一次正式向外公布的时间)。以后借助于Internet 网络,并经过全世界各地计算机爱好者的共同努力下,现已成为今天世界上使用最多的一种UNIX 类操作系统,并且使用人数还在迅猛增长。GNU 计划和自由软件基金会(the Free Software Foundation - FSF)于 1984 年创办。旨在开发

19、一个类似 Unix、并且是自由软件的完整操作系统:GNU 系统。在Linux平台上运行的软件都是免费使用的,且你可以随意的改动代码部分,只要他们是完全基于GNU的。1.5.2 Gtk+图形开发库简介Gtk+(GIMP Toolkit,GIMP工具包)是一个用于创造图形用户接口的图形库。Gtk+是基于LGPL授权的。Gtk+图形库使用一系列称为“构件”的对象来创建应用程序的图形用户接口。它提供了窗口、标签、命令按钮、开关按钮、检查按钮、无线按钮、框架、列表框、组合框、树、列表视图、笔记本、状态条等构件。可以用它们来构造非常丰富的用户界面。在用Gtk+开发Gnome的过程中,由于实际需要,在上面的

20、构件基础上,又开发了一些新构件。一般把这些构件称为Gnome构件(与Gtk+构件相对应)。这些构件都是Gtk+构件库的补充,它们提供了许多Gtk+构件没有的功能。从本质上来说, Gtk+构件和Gnome构件是完全类似的东西。GTK本质上是面向对象的应用程序编程接口(API )。虽然完全是用C写成的,但它仍然是用类和回调函数(指向函数的指针)的方法实现的。1.5.3 Gnome的开发结构简介只使用Gtk+ 构件也可以开发出优秀的Linux应用程序,但是Gnome构件,特别是GnomeApp、GnomeUIInfo等,使开发界面一致的应用程序变得更加容易。Gnome的一些新特性,如popt参数分析

21、,保存应用程序设置等也是Gtk+构件所没有的。Gnome的开发架构包含以下一些内容:1. 非Gnome 库:2. Gnome库:3. 其他库这些库一般被使用在Gnome应用程序中,但它不是Gnome-libs 专属的部分。1.5.4 Glade集成开发工具简介Glade是面向GTK+/Gtkmm的图形界面开发工具。它向用户提供可视化的界面设计环境,并以XML文件的格式进行保存。Glade提供了一个类库,在程序运行的时候,它可以通过读取XML文件而生成相应的程序界面,从而达到了程序代码逻辑与用户界面的完全分离。另一方面,有另一个工具(glade-)可以用来把这些XML文件直接生成相应的Gtk+/

22、Gtkmm代码。对于比较小型的项目,这种方法是比较适用的。这种通过XML对界面进行描述的特性极大地增强了程序的灵活性,界面的设计与代码的编写可由相关的人员进行。也许这是以后桌面应用程序开发的一个方向。1.5.5 编程语言和编程工具简介因为C语言是平台适应性最强的语言,差不多每种平台上都会有一个C编译器。C语言也更易移植,因而,在Linux下编程的最佳语言应该是C语言,Linux上的很多应用程序就是用C语言写的。因为Gtk+ 和Gnome是用C语言编写的,所以在开发Linux下的GUI程序时使用C语言是非常方便的。Linux发布版本中都提供了C编译器gcc,它目前的版本是4.1。Linux系统下

23、的gcc(GNU C Compiler)是GNU推出的功能强大、性能优越的多平台编译器,是GNU的代表作品之一。gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%30% gcc 编译器能将C、C+语言源程序、汇程式化序和目标程序编译、连接成可执行文件,如果没有给出可执行文件的名字,gcc将生成一个名为a.out的文件。 调试器GDB能让你观察另一个程序在执行时的内部活动,或程序出错时发生了什么。GDB主要能做四件事(包括为了完成这些事而附加的功能),帮助用户找出程序中的错误。运行程序,设置所有的能影响程序运行的东西。保证程序在指定的条件下停

24、止。当程序停止时,让用户检查发生了什么。改变程序。那样用户可以试着修正某个bug引起的问题,然后继续查找另一个bug。用户可以用GDB来调试C和C+写的程序。1.6 本章小结随着计算机应用技术的日益普及,网络也遍及到我们生活的每个角落,很好的利用这人资源,将为我们的工作和学习带来极大的方便和提高工作效率。所以,开发一个网络里的C/S通讯软件是十分必要的。由于设计该软件的主要目的是深入的学习Linux平台上应用程序的编写方法,本系统将采用GNU的理论方法进行开发。2 软件需求分析为了开发出符合要求的网络聊天程序,首先必须知道使用者的需求。对需求的深入理解是开发工作获得成功的前提条件,它对目标项目

25、提出完整、准确、清晰、具体的要求。2.1 软件功能需求登录功能。申请新用户的功能。客户可以通过服务器转发,实现一对一的聊天。服务器端可以保存用户的信息。客户端程序可以显示在线好友。应该具有易用、美观的图形界面。2.2 总体性能需求2.2.1 服务器端性能需求服务器需要同时连接很多个用户,并能提供给这些连接用户所需要的任务处理请求,这就要求服务器能同时处理多个socket连接。服务器模型一般分为循环服务器和并发服务器,循环服务器一次只能处理一个连接,也就是说同一时间只能由一个用户连接到服务器进行消息处理,这种情况是不被允许的。因此我们将采用多线程方式的并发服务器来设计服务器端,这样将能从很大程度

26、上提高服务器的运行效率。2.2.2 客户端性能需求客户端只需要连接到服务器便可以进行任务的处理工作,因此客户端的主要性能要求为图形界面运行的稳定性和对出错信息的及时反映。当一个窗体出现问题时能够及时的处理,让主程序不受影响。2.3 错误处理需求所有的应用程序在运行过程中都会出现出错的情况,这种错误可能来自于程序本身的BUG也可能是用户操作的失误所造成的。当有错误发生时,我们应该有一个很好的机制来保障错误能够及时地被排除。因此,当应用程序出现了错误的时候我们就需要程序能提供给我们出错的信息,这样用户就能够很快的找出具体的出错原因,以便寻找合理的途径去解决它。2.4 本章小结需求是开发的前提,只有

27、明确了需求才能开发出一个符合用户期望的优质软件。上面已经总体上列出该聊天程序的基本功能需求,接下来的工作就是如何将这些功能开发的尽量完善,使得界面清晰简单,方便易用。3 程序设计方案3.1 方案比较3.1.1 采用TCP方式连接TCP方式连接的一个显著特点就是需要有服务器,这种类型的程序通常被称为客户机/服务器模式。客户机/服务器模型也是一种网络模型,但与前述的网络模型不同,它并不是定义了网络的层次结构,而是描述了一种网络程序运行的方式。客户及/服务器模型将网络应用程序分为客户和服务器两部分。客户方对服务器方发送信息请求,服务器方对其做出相应回答,提供服务。在TCP/IP网络应用中,多数网络应

28、用程序是使用客户/服务器模型设计的。服务程序通常在一个众所周知的地址监听对服务的请求,也就是说,服务进程一直处于休眠状态,直到一个客户程序提出了请求信息。此时,服务程序被"惊醒"并且为客户提供服务,对客户的请求做出适当的反应。虽然基于连接的服务是设计客户/服务器应用程序的标准,但有些服务也是可以通过数据报Socket提供的。当建立服务器程序时,应该将服务器程序设计成等候客户的请求。TCP传输层通过协议端口和应用程序通信,也就是说,为了接收客户请求,服务器程序必须对传输层的一个特定协议端口进行侦听。当服务器配置socket接口时,它使用bind()函数让socket执行体登记

29、一个协议端口。也就是说,程序告诉socket执行体使用哪一个协议端口进行数据传送。Socket执行体接着告诉传输层某个特定协议端口已被使用,并将其收到的所有数据传送给Socket API。3.1.2 采用UDP方式连接采用UDP协议的程序不需要有服务器,两个程序之间可以通过无连接的方式进行通信,所以无连接是使用UDP协议程序的一个显著特点。使用无连接协议的程序和使用面向连接协议的服务器程序之间的主要相似之处是它们都必须对一个协议端口进行侦听。例如,无连接和连接服务器程序必须在协议端口侦听客户请求。同样,由于无连接客户程序没有和远地主机建立直接连接,所以它也必须对协议端口进行侦听,以便接收以对它

30、服务请求产生的数据报应答。Socket API中的bind()函数让程序将一个本地地址(包括主机地址和协议端口)和一个Socket联系起来。下面程序行显示了一个典型的函数调用:resultbind ( socket_handle, local_structure socket_address, address_ length)无连接客户程序也对一个协议端口进行侦听。使用无连接协议的程序不和远地主机建立直接连接。无连接客户程序使用数据报发送网络服务请求,它不建立点到点连接。因此无连接客户程序必须在一个协议端口,对应答数据报进行侦听。与服务器程序一样,无连接客户程序也使用bind函数让Socket

31、执行体登记协议端口。也就是说,类似服务器程序,无连接客户程序告诉Socket执行体使用哪个协议端口进行数据传输。Socket执行体处理传输层内UDP软件模块和客户程序之间的接口。3.2 方案选择综合以上分析,本软件开发选择方案如下:Linux系统采用C语言开发, TCP方式进行连接。采用C/S结构。系统界面美观内容丰富,很好的实现了与用户的交互。3.3 总体设计方案为实现网络聊天的功能,该软件采用Socket编程,服务器与客户端采用了TCP/IP方式连接,在设计聊天方案时,实行将所有信息发往服务器端,再由服务器进行分别处理的思路,服务器端是所有信息的中心。3.3.1 服务器功能模块划分服务器负

32、责向各个客户端发布系统消息。接受来自客户端的各种信息并分别处理。针对这些操作,服务器做了如下的模块划分:处理登陆信息模块:检查登陆信息是否正确,并向客户端返回登陆信息,如信息正确。就将在线用户发给该用户,并将该用户的状态发给各在线用户。同时在服务器端显示出来。处理聊天信息模块:转发消息给指定的用户。处理申请信息模块:通过用户申请模块进行新用户的注册,保存该用户信息。发布系统消息模块:将用户上下线的消息发给各客户端,并改写用户在服务器端和客户端的状态。服务器功能示意图:服务器端处理申请信息转发聊天信息处理登陆信息发布系统消息图4-1 服务器功能模型3.3.2 客户端功能模块划分客户端主要负责处理

33、用户的操作信息,当用户做出相应的动作时客户端应该能够及时地做出相应,当GTK图形程序检测到鼠标点击时,将触发一个事件,对该事件进行动作的定义和函数的编写便可完成相应的动作。因此,针对这些操作特性,将客户端模块进行如下划分:登陆功能模块:建立与服务器的连接并登陆,能显示登陆错误信息。界面显示模块:将在线好友显示在好友列表中,并显示其当前状态。聊天功能模块:处理各种聊天信息,并判断消息类型。离线消息模块:接收和发送离线消息,对离线消息进行处理。配置信息模块:提供基本的软件配置操作。客户端功能示意图:登陆到服务器客户端界面显示模块配置信息模块聊天功能模块离线消息模块 息图4-2 客户端功能模型3.3

34、.3 消息标识的定义#define GIF_LOGIN_MSG 1 用户登录#define GIF_CALL_MSG 2 用户呼叫#define GIF_ADDRLIST_MSG 3更新联系人列表信息#define GIF_ADD_CONTACTS_MSG 4 添加连接信息#define GIF_DELETE_CONTACTS_MSG 5 删除连接信息#define GIF_CHAT_MSG 6聊天信息#define GIF_DISCONNECT_MSG 7 用户下线消息#define GIF_SUCCESS_N_ERROR_MSG 8消息请求成功或失败信息#define GIF_OFFLIN

35、E_REQUEST_MSG 9 发送离线消息#define GIF_OFFLINE_MSG 10 离线消息#define GIF_OFFLINE_DELETE_MSG 11 删除离线消息用户发送消息成功或失败定义:#define GIF_ERROR_LOGIN_INCORRECT 101 错误的登陆信息#define GIF_SUCCESS_ADD_CONTACTS 102 添加连接信息成功#define GIF_ERROR_ADD_CONTACTS 103 添加连接信息错误#define GIF_SUCCESS_DELETE_CONTACTS 104 删除连接信息成功#define GIF_

36、ERROR_DELETE_CONTACTS_NOT_A_CONTACT 105 用户离线#define GIF_ERROR_DELETE_CONTACTS_NOT_A_MEMBER 106 无指定用户3.3.4 消息结构体的设计消息头:typedef struct _gifhdr_tunsigned int type;unsigned int length;char sender10;char receiver10;unsigned int reserved;gifhdr_t;用户信息结构:typedef struct _users_tchar loginid20;char password2

37、0;users_t;在线用户信息结构:typedef struct _online_users_tchar loginid20;int sockfd;online_users_t;用户联系人信息结构:typedef struct _user_contacts_tchar loginid20;user_contacts_t;用户当前状态:typedef struct _user_status_tchar loginid20;unsigned int status;user_status_t;离线消息存储时离线消息结构:typedef struct _offline_msgs_tchar send

38、er20;char dateserial20;unsigned int new;char message1024;offline_msgs_t;用户发送离线消息结构:typedef struct _offline_msgs_send_tchar sender20;char dateserial20;unsigned int new;unsigned int length;offline_msgs_send_t;4 软件流程本节主要叙述了该软件的整体运作流程,包括服务器和客户端对消息的处理等流程,通过本节将能够对软件的工作流程得到一个总体的认识。4.1 服务器消息处理流程服务器运行后即处于监听状

39、态,当监听到有连接请求时服务器进入消息处理流程,因为服务器为并发服务器,所以可以同时对多个请求做出相应。具体流程如下图所示:图 4-3 服务器流程图 4.2 客户端操作流程这款聊天软件的客户端采用图形化用户接口方式,GTK图形界面的主要特点就是事件触发,当处理引擎接收到某一窗体消息时,处理引擎就会按照事先编写好的函数作相应的处理动作,下图总体上描述了客户端软件的操作处理流程:图 44 客户端操作流程图4.3 客户端消息发送和接收流程客户端运行后首先要用户登录到服务器,如果登陆成功服务器会将在线的用户联系人列表发送给客户端,此时客户端即可显示有哪些好友在线而哪些是离线的。当用户点击在线好友时便会

40、弹出一个聊天信息窗体,该窗体用于发送和接收用户的聊天信息。当用户点击离线用户时便会触发一个离线消息事件,该事件通过服务器转发方式发送给离线用户,当对方上线时便可查看该离线消息。具体流程如下图所示:图 4-5 客户端消息处理流程图4.4 申请用户流程运行用户管理程序添加用户显示用户删除用户退出程序管理员在服务器一端统一注册用户,然后将账号分发给各用户,申请用户为单独程序完成,当新用户注册好后系统会创建3个用户信息表用来保存相应的客户信息。具体流程如下图所示:图 4-6 管理用户流程图5 详细设计该部分详细讲述了服务器和客户端的界面和代码,直观地对该软件进行设计说明,通过该部分将对软件有一个全面的

41、了解。5.1 服务器主要函数和变量套接字描述字:int sockfd, client_sockfd套接字地址结构:struct sockaddr_in servAddr, cliAddr线程id标识:pthread_t pthd线程调用函数:void gif_handle_client(int client_sockfd)服务器主体函数只负责了套接字的创建、帮定和监听任务,一旦服务器接收到了来自客户端的消息后,就会创建一个线程来处理该连接,当线程创建后它就会调用该函数对客户消息进行处理。该函数中有7个主要消息处理模块,这些模块针对不同的客户消息进行处理,将他们组合在一起便形成了一套完整的消息处

42、理机制。在4.2.1中我们叙述了服务器的消息处理流程,而最后的消息处理部分就是由这7个模块来完成的。发送联系人状态函数:void gif_send_clients_contact_list(chat *client_loginid,int client_sockfd, int type)该函数的主要作用是当用户的在线状态标志发生变动时,服务器要及时地做出判断,并向该用户的联系人发送该用户状态变更后的信息,以便对方能够及时地了解到联系人的状态信息。获取系统时间函数:char *gif_get_system_time()该函数取出当前系统时间并随消息一同发出,以便让用户能更好的了解到消息是何时发出

43、的。5.2 服务器消息处理模块的设计与实现服务器的消息处理模块主要由7部分组成,下面进行分别论述:用户登录消息处理模块:当服务器接收到用户消息并判断是登录消息后,服务器将根据用户所发送过来的用户名和密码到users.db表中进行匹配,如果匹配成功则把该用户加入到online.db表中,设置用户在线状态为真的同时调用发送联系人在线列表函数,向添加该用户为好友的用户发送该用户的上线信息。如果匹配不成功,服务器将发送登录失败消息给客户端,要求用户重新登录。添加好友信息处理模块:当服务器收到用户请求加好友的消息时,服务器首先在users.db中查找要被添加的用户是否存在,如果该用户存在则把该用户的信息

44、存储到当前用户的好友文件中,同时在被添加好友的用户的_as.db表中保存当前用户的信息。删除好友信息处理模块:当服务器接收到用户的该消息请求时,服务器根据用户所提供的好友用户名来删除被指定的好友,同时将用户联系人表进行更新,在被删除的好友的被添加好友表_as.db中将当前用户删除。用户聊天信息转发的处理模块:当服务器判断用户所请求的信息为聊天消息后,服务器会根据用户所指定的聊天对象到online.db表中查找被指定用户是否在线,如果被指定用户在线则提取他的套接字地址结构,并按照该套接字信息将消息转发。如果用户不在线则将消息标识设定为离线消息,并将该消息写入被指定用户的离线消息文件中。用户下线消

45、息处理模块:当服务器判断用户所请求的信息为下线消息后,服务器将把用户从online.db中删除,设置该用户状态为下线,同时调用发送联系人状态函数将标志位设置为离线向该用户的联系人发送。离线消息处理模块:当服务器判断用户所请求的信息为读取离线消息后,服务器会去读用户的离线消息文件,如果该文件中有被标识为新的离线消息时,服务器将把该消息提取出来发送给用户,同时把该消息标识为已读。删除离线消息处理模块:如果客户做出了删除离线消息的动作,那么服务器端将会根据用户的发送信息把该用户的离线消息文件中的离线消息删除。5.3 服务器数据存储的方法该服务器采用文件作为数据存储的对象。之所以采用这种发式是因为该服

46、务器作为一个小型的聊天软件的服务器,本身所要求保存的数据量并不大,且用户数量也是比较有限的,在这种情况下采用文件方式对信息进行读取在速度和开销上都要有一些优势,且便于管理员管理用户。在编程时主要使用fopen fread fwrite fclose等函数对文件进行操作,被打开文件的操作权限由fopen的参数来决定,读取控制由fread来完成,fwrite主要负责向文件中写入新的信息。服务器上主要存放5类用户信息文件:用户信息数据文件:users.db该文件中保存了用户的loginid和password。在线用户数据文件:online.db该文件中保存了当前在线用户的loginid和socket

47、信息。用户拥有好友文件:loginid.db该文件中保存了当前用户所添加的好友信息。被添加为好友文件:loginid_as.db该文件中保存了有哪些用户把当前用户添加为好友。离线消息存储文件:loginid_off.db该文件中保存了其它用户发给当前用户的离线消息。5.4 客户端主要窗口设计根据前面的选题背景和需求分析,此款软件的客户端部分提供了图形用户界面,程序运行后激活主窗体,在主窗体上点击设置为敏感状态的按钮就会产生相应的事件,该事件将会触发一个消息驱动所指定的函数来处理这个操作。主窗体:该窗体中包含了所有的用户操作按钮和好友列表,用户的操作都在这个窗体中完成。图 4-7 程序主窗口窗体

48、中包含按钮:Conn:登陆按钮,点击可激活登录窗口Add: 添加好友按钮Conf:程序配置按钮Offline:查看离线消息按钮Conn菜单:包含Conn、Disconnect和Quit按钮Contacts菜单:包含Add、Delete和Offline按钮Help菜单:包含About按钮联系人列表:Status列:显示联系人状态信Contacts列:显示好友列表Available显示表示用户有好友当用户无好友时显示Not Available登录窗口:当用户点击主窗口中的Conn按钮时,该窗体被激活。需要填写信息:Server ip:填写服务器地址User id: 填写用户名Password :填

49、写密码点击按钮的消息事件:Cancel:退出当前窗口Clear:清空填写的信息OK:触发on_butOk_clicked函数该函数用于连接服务器并同服务器进行信息的发送与接收图 4-8 登录窗口添加用户窗口:当用户电击主窗口中的Add按钮时该窗体被激活。Contacts id:填写要添加的好友的loginid号OK:GIF_ADD_CONTACTS_MSG同时向服务器发送消息请求图 4-9 添加好友窗口系统消息窗口:当用户的操作成功或者失败的时候,系统会显示一条消息给用户,以便提示用户操作是否成功。在相关的函数内将该窗口的激活属性打开,消息窗口便会自动的弹出并显示消息。图 4-10 系统消息窗

50、口离线消息窗口:当用户点击主窗口中的Offline按钮时,该窗体被激活。离线消息可以查看当用户不在线时,有哪些用户向该用户发送了离线消息。图 4-11 离线消息窗体聊天窗口:当用户点击好友时,该窗口被激活。图 4-12 聊天窗口红色显示的是用户自身,蓝色为联系人。上面的窗体是客户端用户在使用中会经常使用到的一些窗口事件,这些部件统一起来便形成了一套完整的客户端图形用户界面。5.5 客户端主要函数和变量GtkWidget *tree:用于显示客户端联系人列表的树视图GtkWidget *offline_tree:用于显示离线消息的树视图GtkWidget *chat_window100:用于保存

51、聊天窗体的编号。GtkListStore *offline_temp_store:定义一个离线消息数据管理类型。GtkTreeIter offline_selected_iter:定义一个查询离线消息的迭代器。GtkTreeModel *offline_selected_model:定义离线消息查询数据管理接口。GtkCellRenderer *renderer:定义一个数据表现形式绘制类型。enumCONTACTS_COLUMN_TEXT,STATUS_COLUMN_PIXMAP;上面的枚举类型定义了用户联系人视窗中的列标识。enumOFFLINE_NEW_PIXMAP,OFFLINE_SE

52、NDER_TEXT,OFFLINE_DATESERIAL_TEXT,OFFLINE_MSG_TEXT,OFFLINE_COLUMNS;上面的枚举类型定义了用户离线消息查看窗口中的列标识。gtk_widget_set_sensitive(widget, TRUE):设置指定控件的敏感度TRUE可以点击 FALSE则不能点击。Void gif_receive_messages(int server_sockfd):处理从服务器端发送过来的消息,根据信息包所携带的消息类型信息选择消息处理模块。void gif_call_client_for_chat(GtkTreeSelection *select

53、ion, gpointer data):当用户点击联系人时会产生一个消息事件,程序根据用户所选择的联系人生成聊天窗口,并对该窗体进行初始化。在系统调用线程时为保证线程安全,需要前后分别调用gdk_threads_enter ()和gdk_threads_leave ()函数。例如:gdk_threads_enter();gtk_widget_show(create_msgbox("error", "Server Disconnected");gdk_threads_leave();5.6 客户端功能模块的设计与实现用户认证模块:主要用到的函数为:conn

54、ect(),send(),pthread_create()当用户启动程序后首先需要用户登陆到服务器才能进一步的对软件进行操作,这一部分即为用户认证模块。该模块在登陆窗口中收集服务器的IP地址和用户的用户名和密码。当用户点击登陆后,系统将用户输入的IP地址写入Socket地址结构,然后对套接口地址结构进行绑定。同时将用户名写入消息头结构体,并将密码随同数据字段一起发送给服务器。如果登陆成功,则创建线程来维护和服务器的连接。之后,程序进入主体运行状态,各功能模块被激活。界面显示模块:当用户成功登陆后,在联系人列表中将会显示用户的联系人信息,在离线消息窗口中会显示接收到的离线消息,这两个视图均是用列

55、表视图来实现的。用户列表和离线消息列表的构建是通过下面的函数来实现的:新建一个数据的存储模型store= gtk_tree_store_new (2, G_TYPE_STRING, GDK_TYPE_PIXBUF);新建一个管理视图tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store);将视图添加到指定的容器中gtk_container_add (GTK_CONTAINER (scrolledwindow1), tree);通过以上的3个步骤,就会在容器中生成一个可供用户查看的滚动视图。但这个视图中并没有定义列信息,业就是说这是一

56、个空的无任何用处的列表视图,要将用户的信息显示出来,还需要使用到以下的函数:新建一个图像类型的绘制方式renderer = gtk_cell_renderer_pixbuf_new ();给列添加新的属性,STATUS_COLUMN_PIXMAP指定了行信息,”pixbuf”指定了绘制类型为图像,renderer指定了绘制方式column = gtk_tree_view_column_new_with_attributes ("Status", renderer, "pixbuf", STATUS_COLUMN_PIXMAP, NULL);将建好的列添加到树视图中gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);通过以上3个步骤一个视图中就有了列,在进行相同的操作可创

温馨提示

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

最新文档

评论

0/150

提交评论