Linux下基于Socket聊天软件的研究与实现毕业设计论文.docx_第1页
Linux下基于Socket聊天软件的研究与实现毕业设计论文.docx_第2页
Linux下基于Socket聊天软件的研究与实现毕业设计论文.docx_第3页
Linux下基于Socket聊天软件的研究与实现毕业设计论文.docx_第4页
Linux下基于Socket聊天软件的研究与实现毕业设计论文.docx_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

Linux下基于Socket聊天软件的研究与实现小组成员与分工明细5矚慫润厲钐瘗睞枥庑赖。第1章 前言5聞創沟燴鐺險爱氇谴净。1.1 系统研究的背景与意义5残骛楼諍锩瀨濟溆塹籟。1.2 即时通讯软件的研究与应用现状5酽锕极額閉镇桧猪訣锥。1.3 开发环境简介6彈贸摄尔霁毙攬砖卤庑。1.3.1 Linux系统简介6謀荞抟箧飆鐸怼类蒋薔。1.3.2 开发语言及编程工具简介6厦礴恳蹒骈時盡继價骚。1.4 TCP/IP协议简介7茕桢广鳓鯡选块网羈泪。1.4.1 TCP协议简介7鹅娅尽損鹌惨歷茏鴛賴。1.4.2 UDP协议简介8籟丛妈羥为贍偾蛏练淨。第2章 相关技术介绍9預頌圣鉉儐歲龈讶骅籴。2.1 Linux的SOCKET编程介绍9渗釤呛俨匀谔鱉调硯錦。2.1.1网络中进程之间如何通信9铙誅卧泻噦圣骋贶頂廡。2.1.2 Socket介绍10擁締凤袜备訊顎轮烂蔷。2.1.3 Socket接口函数10贓熱俣阃歲匱阊邺镓騷。2.2 开源XML解析库简介11坛摶乡囂忏蒌鍥铃氈淚。2.2.1 TinyXML简介11蜡變黲癟報伥铉锚鈰赘。2.1.2 TinyXML的编译11買鲷鴯譖昙膚遙闫撷凄。第3章 系统需求分析14綾镝鯛駕櫬鹕踪韦辚糴。3.1服务端14驅踬髏彦浃绥譎饴憂锦。3.1.1监听并建立客户端的连接14猫虿驢绘燈鮒诛髅貺庑。3.1.2 数据库的增删查改14锹籁饗迳琐筆襖鸥娅薔。3.1.3 在线用户的管理14構氽頑黉碩饨荠龈话骛。3.2客户端14輒峄陽檉簖疖網儂號泶。3.3 系统运行状态跟踪15尧侧閆繭絳闕绚勵蜆贅。第4章 系统设计15识饒鎂錕缢灩筧嚌俨淒。4.1服务端15凍鈹鋨劳臘锴痫婦胫籴。4.1.1 接收客户端的连接15恥諤銪灭萦欢煬鞏鹜錦。4.1.2数据库设计16鯊腎鑰诎褳鉀沩懼統庫。4.1.3 聊天模块设计18硕癘鄴颃诌攆檸攜驤蔹。4.1.4 服务器与客户端之间的心跳模型19阌擻輳嬪諫迁择楨秘騖。4.2客户端20氬嚕躑竄贸恳彈瀘颔澩。4.2.1用户界面设计20釷鹆資贏車贖孙滅獅赘。4.2.2 功能模块设计22怂阐譜鯪迳導嘯畫長凉。4.3 log日志22谚辞調担鈧谄动禪泻類。第5章 系统的实现22嘰觐詿缧铴嗫偽純铪锩。5.1服务端的实现22熒绐譏钲鏌觶鷹緇機库。5.1.1服务器启动22鶼渍螻偉阅劍鲰腎邏蘞。5.1.2监听客户端23纣忧蔣氳頑莶驅藥悯骛。5.1.3服务器端与客户端连接成功23颖刍莖蛺饽亿顿裊赔泷。5.1.4服务器端与客户端通信24濫驂膽閉驟羥闈詔寢賻。5.2 客户端的实现31銚銻縵哜鳗鸿锓謎諏涼。5.2.1与服务端建立连接31挤貼綬电麥结鈺贖哓类。5.2.2 用户注册实现31赔荊紳谘侖驟辽輩袜錈。5.2.3用户登陆实现35塤礙籟馐决穩賽釙冊庫。5.2.5 用户查询修改信息实现36裊樣祕廬廂颤谚鍘羋蔺。5.2.6 用户聊天42仓嫗盤紲嘱珑詁鍬齊驁。5.2.7 用户退出45绽萬璉轆娛閬蛏鬮绾瀧。5.3 log日志模块的实现46骁顾燁鶚巯瀆蕪領鲡赙。第6章 部署运行50瑣钋濺暧惲锟缟馭篩凉。结 论50鎦诗涇艳损楼紲鯗餳類。小组成员与分工明细姓名学号分工明细吕吕2014210310591.系统架构设计2.数据库设计3.服务端编码与测试4.小组文档第3、4章书写5.tinyxml的研究与编译王琥2014210311341.需求分析2.客户端部分编码3.系统整体测试和测试文档书写4.小组文档第5、6章、结束书写5.演示视频录制黄键华2014210310421. 需求分析2. 客户端部分编码与客户端测试3.log日志系统实现4. 小组文档第1、2章书写第1章 前言1.1 系统研究的背景与意义在网络无所不在的今天,在Internet上,有ICQ、MSN、Gtalk、OICQ,QQ等网络聊天软件,极大程度上方便了处于在世界各地的友人之间的相互联系,也使世界好像一下子缩小了,不管你在哪里,只要你上了网,打开这些软件,就可以给你的朋友发送信息,不管对方是否也同时在线,只要知道他有号码。栉缏歐锄棗鈕种鵑瑶锬。本次课程设计主要是为了加强对Linux系统下的编程的各种知识点的整合与灵活运用,让我们更加熟悉Linux下的编程操作。重点在Linux下socket编程,了解TCP、UDP等协议的使用,并完成软件工程方向的实践。辔烨棟剛殓攬瑤丽阄应。Linux 操作系统作为一个开源的操作系统被越来越多的人所应用,它的好处在于操作系统源代码的公开化!只要是基于GNU公约的软件你都可以任意使用并修改它的源代码。但对很多习惯于Windows操作系统的人来说,Linux的操作不够人性化、交互界面不够美观,这给Linux操作系统的普及带来了很大的阻碍。因此制作一个Linux 操作系统下的拥有人性化界面的实时通讯工具,将给那些刚刚接触Linux操作系统的用户带来极大的方便,而且通过设计这样的一个应用程序还能更好的学习网络编程知识和掌握Linux平台上应用程序设计开发的过程,掌握Socket网络通信编程的技术应用,将研究生阶段所学知识综合运用,以达到检验学习成果的目的。峴扬斕滾澗辐滠兴渙藺。1.2 即时通讯软件的研究与应用现状即时通讯软件的发展经历了BBS、IRC、ICQ和视频会议这几个过程,早期BBS、IRC只能说是即时通讯软件的雏形,还算不上是真正的即时通讯软件,然丽它们却是即时通讯软件发展的必经之路,对真正的即时通讯软件的诞生起到了毋庸置疑的作用。直到今天,这些软件也有着它们的空间,它们的相关技术也被早期的腾讯QQ借鉴。詩叁撻訥烬忧毀厉鋨骜。如今,市场上即使通讯软件种类繁多,借助网络技术的发展和电脑的普及,通讯软件如雨后春笋,在21世纪初得到了迅猛的发展。以微信,QQ为代表,即时通讯软件的发展已经日渐成熟。则鯤愜韋瘓賈晖园栋泷。除了桌面版的即时通讯软件,现在也有很多在网络上不使用服务器的通讯软件,这种软件小巧且方便,也能解决一部分问题。但是有服务器的通讯软件,有着不可比拟的优势:可以发送离线消息,不管用户当时是否在线,下次上线时,就可以看到这条消息了。可以保存用户的个人信息或个人简介,供人查看。而且,无服务器的通讯软件,是以机器为通讯单元的,而有服务器的聊天软件是以人为通讯单元的。所以,带服务器的聊天软件在网络上,有着非常广泛的用途,为网络上的通讯带来了极大的方便,它使人与人之间的交流不再只局限于某一个范围,这让程序开发人员有了新的快捷的沟通方式。胀鏝彈奥秘孫戶孪钇賻。1.3 开发环境简介1.3.1 Linux系统简介Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。鳃躋峽祷紉诵帮废掃減。通常所说的Linux,指的是GNU/Linux ,即采用Linux内核的GNU操作系统。GNU 代表既是一个操作系统,也是一种规范。Linux最早由Linus Torvalds在1991年开始编写。在这之前,Richard Stallman创建了Free Software Foundation(FSF)组织以及GNU项目,并不断的编写创建GNU程序(程序的许可方式均为GPL:General Public License)。在不断的有程序员和开发者加入到GNU组织中后,变造就了今天我们所看到的Linux!以Linux内核的GUN/Linux操作系统使用了大量的GNU软件,包括了shell程序、工具、程序库、编译器及工具,还有许多其他程序,例如Emacs。正因为如此,GNU计划的开创者理查德马修斯托曼博士提议将 Linux操作系统改名为GNU/Linux。但有些人只把操作系统叫做Linux。Linux的基本思想有两点:第一,一切都是文件;第二,每个软件都有确定的用途,同时它们都尽可能被编写得更好。其中第一条详细来讲就是系统中的所有都归结为一个文件,包括命令、硬件和软件设备、操作系统、进程等等对于操作系统内核而言,都被视为拥有各自特性或类型的文件。Linux是一种自由和开放源码的类Unix操作系统。目前存在着许多不同的Linux,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,从手机、平板电脑、路由器和视频游戏控制台,到台式计算机、大型机和超级计算机。Linux是一个领先的操作系统,世界上运算最快的10台超级计算机运行的都是Linux操作系统。严格来讲,Linux这个词本身只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU 工程各种工具和数据库的操作系统。Linux得名于计算机业余爱好者Linus Torvalds。稟虛嬪赈维哜妝扩踴粜。GNU 计划和自由软件基金会(the Free Software Foundation - FSF)于 1984 年创办。旨在开发一个类似 Unix、并且是自由软件的完整操作系统:GNU 系统。在Linux平台上运行的软件都是免费使用的,且你可以随意的改动代码部分,只要他们是完全基于GNU的。陽簍埡鲑罷規呜旧岿錟。1.3.2 开发语言及编程工具简介(1)GNU C+C+是一门有国家标准的规范编程语言。最新的C+标准是C+11,指的是 ISO/IEC 14882:2011。C+11标准由国际标准化组织(ISO)和国际电工委员会(IEC)旗下的C+标准委员会(ISO/IEC JTC1/SC22/WG21)于2011年8月12日公布2 ,并于2011年9月出版。正在酝酿的C+14标准还未正式发布,不过已箭在弦上,草案已于2014年经过C+标准委员投票,获得一致通过。沩氣嘮戇苌鑿鑿槠谔應。对于GNU C+,指的是GNU组织根据C+标准规范实现的C+,相对于Visual C+来说,二者的区别是GNU C+ 是针对于linux平台上的应用开发而产生的, Visual C+则针对于WINDOWS平台上的应用。钡嵐縣緱虜荣产涛團蔺。(2)g+本次系统开发使用的编译器是g+。g+是由GNU组织开发和发布的开源免费的强大的C+编译器,Linux平台的C+开发,无一例外,基本上使用的都是g+。其他IT公司在g+的基础之上,也封装了自己的针对自身公司产品的编译器,比如Itel的针对MIC计算卡的icpc,NVIDIA针对GPU的nvcc等等。懨俠劑鈍触乐鹇烬觶騮。gcc/g+在执行编译工作的时候,总共需要4步l 预处理,生成.i的文件预处理器cppl 将预处理后的文件转换成汇编语言,生成文件.s编译器egcsl 由汇编变为目标代码(机器代码)生成.o的文件汇编器asl 连接目标代码,生成可执行程序链接器ld(3)make与makefilemakefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。makefile带来的好处就是“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C+的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。謾饱兗争詣繚鮐癞别瀘。1.4 TCP/IP协议简介1.4.1 TCP协议简介本系统开发所采用的是面向连接的TCP协议,所以我们这里就只对TCP(传输控制协议)这一部分作详细的介绍。呙铉們欤谦鸪饺竞荡赚。TCP:传输控制协议(TCP:Transmission Control Protocol)传输控制协议是一个 TCP/IP 组中能够实现可靠数据传送的传输层协议,并通过顺序响应能实现对应用程序的虚拟连接服务,在必要的时候进行包转发。与 IP 协议相结合,TCP 代表了网络协议的核心。莹谐龌蕲賞组靄绉嚴减。大多数网络应用程序是在相同的机器上运行的,计算机上必须能确保目的地的应用程序从源地址处获得数据包,及源计算机上的应用程序的回复获得选择的路经。这一过程是通过使用 TCP 的“端口号”完成的。网络IP地址和端口号的连接要达到唯一的标识,我们称之为“套接字”或“端点”。为了可靠通信,TCP 在端点间建立了连接或虚拟电路。麸肃鹏镟轿騍镣缚縟糶。TCP 服务提供了数据流传输、可靠行、有效流控制、全双工操作和多路复用技术等。关于数据流传输,TCP 发送一个由序列号定义的无结构的字节流。这对应用程序有利,因为在被送出 TCP 之前应用程序不需要划分成块,TCP 可以将字节整合成字段,然后发送给IP。納畴鳗吶鄖禎銣腻鰲锬。TCP 是面向连接的端到端的可靠协议,并保证传送数据包的顺序,而顺序是用一个响应序号来保证的,这个响应序号告诉接收者发送者期望的下一个包。如果在规定时间内,没有收到关于这个包的确认响应,则需要重新发送此包。TCP 的可靠机制允许设备处理丢失、删除及读错的包。暂停机制允许设备监测丢失的包并请求重发。風撵鲔貓铁频钙蓟纠庙。TCP 提供了有效流控制。当向发送者返回发送确认响应,接收 TCP 进程就会暗示最高序列号,它能接收并保证不会发生溢出。灭嗳骇諗鋅猎輛觏馊藹。全双工操作:TCP 进程能够同时发送和接收包。TCP 中的多路技术:大量上层同时会话在单连接时进行多路复用。1.4.2 UDP协议简介UDP(User Datagram Protocol)协议,即用户数据报协议,主要用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天,UDP仍然不失为一项非常实用和可行的网络传输层协议。铹鸝饷飾镡閌赀诨癱骝。与我们所熟知的TCP(传输控制协议)协议一样,UDP协议直接位于IP(网际协议)协议的顶层。根据OSI(开放系统互连)参考模型,UDP和TCP都属于传输层协议。攙閿频嵘陣澇諗谴隴泸。UDP协议的主要作用是将网络数据流量压缩成数据报的形式。一个典型的数据报就是一个二进制数据的传输单位。每一个数据报的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。趕輾雏纨颗锊讨跃满賺。既然UDP是一种不可靠的网络协议,那么还有什么使用价值或必要呢?其实不然,在有些情况下UDP协议可能会变得非常有用。因为UDP具有TCP所望尘莫及的速度优势。虽然TCP协议中植入了各种安全保障功能,但是在实际执行的过程中会占用大量的系统开销,无疑使速度受到严重的影响。反观UDP由于排除了信息可靠传递机制,将安全和排序等功能移交给上层应用来完成,极大降低了执行时间,使速度得到了保证。夹覡闾辁駁档驀迁锬減。 UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是属于TCP/IP协议族中的一种。如图:视絀镘鸸鲚鐘脑钧欖粝。第2章 相关技术介绍2.1 Linux的SOCKET编程介绍2.1.1网络中进程之间如何通信进 程通信的概念最初来源于单机系统。由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如UNIX BSD有:管道(pipe)、命名管道(named pipe)软中断信号(signal)UNIX system V有:消息(message)、共享存储区(shared memory)和信号量(semaphore)等.偽澀锟攢鴛擋緬铹鈞錠。他们都仅限于用在本机进程之间通信。网间进程通信要解决的是不同主机进程间的相互通信问题(可把同机进程通信看作是其中的特例)。为此,首先要解决的是网间进程标识问题。同一主机上,不同进程可用进程号(process ID)唯一标识。但在网络环境下,各主机独立分配的进程号不能唯一标识该进程。例如,主机A赋于某进程号5,在B机中也可以存在5号进程,因此,“5号进程”这句话就没有意义了。 其次,操作系统支持的网络协议众多,不同协议的工作方式不同,地址格式也不同。因此,网间进程通信还要解决多重协议的识别问题。 緦徑铫膾龋轿级镗挢廟。其实TCP/IP协议族已经帮我们解决了这个问题,网络层的“ip地址”可以唯一标识网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用程序(进程)。这样利用三元组(ip地址,协议,端口)就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交互。騅憑钶銘侥张礫阵轸蔼。使用TCP/IP协议的应用程序通常采用应用编程接口:UNIX BSD的套接字(socket)和UNIX System V的TLI(已经被淘汰),来实现网络进程之间的通信。就目前而言,几乎所有的应用程序都是采用socket,而现在又是网络时代,网络中进程通信是无处不在,这就是我为什么说“一切皆socket”。疠骐錾农剎貯狱颢幗騮。2.1.2 Socket介绍应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCPIP协议交互提供了称为套接字(Socket)的接口。 镞锊过润启婭澗骆讕瀘。区分不同应用程序进程间的网络通信和连接,套接字主要有3个参数:通信的目的IP地址、使用的传输层协议(TCP或UDP)和使用的端口号。通过将这3个参数结合起来,与一个Socket绑定,应用层就可以和传输层通过套接字接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。榿贰轲誊壟该槛鲻垲赛。2.1.3 Socket接口函数(1)socket()函数int socket(int protofamily, int type, int protocol);/返回sockfdsockfd是描述符。邁茑赚陉宾呗擷鹪讼凑。socket函数对应于普通文件的打开操作。普通文件的打开操作返回一个文件描述字,而socket()用于创建一个socket描述符(socket descriptor),它唯一标识一个socket。这个socket描述字跟文件描述字一样,后续的操作都有用到它,把它作为参数,通过它来进行一些读写操作。嵝硖贪塒廩袞悯倉華糲。(2)bind()函数int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);该栎谖碼戆沖巋鳧薩锭。bind()函数把一个地址族中的特定地址赋给socket。例如对应AF_INET、AF_INET6就是把一个ipv4或ipv6地址和端口号组合赋给socket。劇妆诨貰攖苹埘呂仑庙。(3)listen()、connect()函数如果作为一个服务器,在调用socket()、bind()之后就会调用listen()来监听这个socket,如果客户端这时调用connect()发出连接请求,服务器端就会接收到这个请求。臠龍讹驄桠业變墊罗蘄。int listen(int sockfd, int backlog);int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);鰻順褛悦漚縫冁屜鸭骞。listen函数的第一个参数即为要监听的socket描述字,第二个参数为相应socket可以排队的最大连接个数。socket()函数创建的socket默认是一个主动类型的,listen函数将socket变为被动类型的,等待客户的连接请求。穑釓虚绺滟鳗絲懷紓泺。connect函数的第一个参数即为客户端的socket描述字,第二参数为服务器的socket地址,第三个参数为socket地址的长度。客户端通过调用connect函数来建立与TCP服务器的连接。隶誆荧鉴獫纲鴣攣駘賽。(4)accept()函数TCP服务器端依次调用socket()、bind()、listen()之后,就会监听指定的socket地址了。TCP客户端依次调用socket()、connect()之后就向TCP服务器发送了一个连接请求。TCP服务器监听到这个请求之后,就会调用accept()函数取接收请求,这样连接就建立好了。之后就可以开始网络I/O操作了,即类同于普通文件的读写I/O操作。浹繢腻叢着駕骠構砀湊。int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); /返回连接connect_fd鈀燭罚櫝箋礱颼畢韫粝。(5)read()、write()等函数服务器与客户已经建立好连接了。可以调用网络I/O进行读写操作了,即实现了网咯中不同进程之间的通信!网络I/O操作有下面几组:惬執缉蘿绅颀阳灣熗鍵。l read()/write()l recv()/send()l readv()/writev()l recvmsg()/sendmsg()l recvfrom()/sendto()(6)close()函数在服务器与客户端建立连接之后,会进行一些读写操作,完成了读写操作就要关闭相应的socket描述字,好比操作完打开的文件要调用fclose关闭打开的文件。贞廈给鏌綞牵鎮獵鎦龐。#include int close(int fd);close一个TCP socket的缺省行为时把该socket标记为以关闭,然后立即返回到调用进程。该描述字不能再由调用进程使用,也就是说不能再作为read或write的第一个参数。嚌鲭级厨胀鑲铟礦毁蕲。注意:close操作只是使相应socket描述字的引用计数-1,只有当引用计数为0的时候,才会触发TCP客户端向服务器发送终止连接请求。薊镔竖牍熒浹醬籬铃騫。2.2 开源XML解析库简介2.2.1 TinyXML简介TinyXML是目前非常流行的一款基于DOM模型的XML开源解析器,简单易用且小巧玲珑,非常适合存储简单数据,配置文件,对象序列化等数据量不是很大的操作。齡践砚语蜗铸转絹攤濼。xml文件本质就是小型的数据库,换个角度来说就是,你对数据库有什么操作你对xml文件就应能实现什么操作。一般而言,对数据库的操作包括以下几种:新建数据库、查询数据库、修改数据库和删除数据库。那么对应xml文件就是新建xml文件、查询xml文件的指定节点的值,修改xml文件中节点的值和删除xml文件中节点的值。绅薮疮颧訝标販繯轅赛。本系统中采用xml文件作为数据库来存储用户的相关信息,替代了传统的MySQL和SQL Server数据库,更加的轻便快捷。其主页是:/tinyxml/ ,目前最新版本是2.5.3 版本。饪箩狞屬诺釙诬苧径凛。2.1.2 TinyXML的编译TinyXML由以下几个文件组成:tinystr.cpp、tinystr.h、tinyxml.cpp、tinyxml.h、tinyxmlerror.cpp和tinyxmlparser.cpp。编译也是采用makefile进行自动化编译成静态库文件,在系统使用时连接进去。TinyXML的makefile如下:烴毙潜籬賢擔視蠶贲粵。# DEBUG can be set to YES to include debugging info, or NO otherwiseDEBUG := NO# PROFILE can be set to YES to include profiling info, or NO otherwisePROFILE := NO# TINYXML_USE_STL can be used to turn on STL support. NO, then STL# will not be used. YES will include the STL files.TINYXML_USE_STL := NO#*CC := gccCXX := g+LD := g+AR := ar rcRANLIB := ranlibDEBUG_CFLAGS := -Wall -Wno-format -g -DDEBUGRELEASE_CFLAGS := -Wall -Wno-unknown-pragmas -Wno-format -O3 -DTIXML_USE_STLLIBS :=DEBUG_CXXFLAGS := $DEBUG_CFLAGS RELEASE_CXXFLAGS := $RELEASE_CFLAGSDEBUG_LDFLAGS := -gRELEASE_LDFLAGS :=ifeq (YES, $DEBUG) CFLAGS := $DEBUG_CFLAGS CXXFLAGS := $DEBUG_CXXFLAGS LDFLAGS := $DEBUG_LDFLAGSelse CFLAGS := $RELEASE_CFLAGS CXXFLAGS := $RELEASE_CXXFLAGS LDFLAGS := $RELEASE_LDFLAGSendififeq (YES, $PROFILE) CFLAGS := $CFLAGS -pg -O3 CXXFLAGS := $CXXFLAGS -pg -O3 LDFLAGS := $LDFLAGS -pgendif#*# Preprocessor directives#*ifeq (YES, $TINYXML_USE_STL) DEFS := -DTIXML_USE_STLelse DEFS :=endif#*# Include paths#*#INCS := -I/usr/include/g+-2 -I/usr/local/includeINCS :=#*# Makefile code common to all platforms#*CFLAGS := $CFLAGS $DEFSCXXFLAGS := $CXXFLAGS $DEFS#*# Targets of the build#*OUTPUT := libtinyxml.aall: $OUTPUT#*# Source files#*SRCS := tinyxml.cpp tinyxmlparser.cpp tinyxmlerror.cpp tinystr.cpp# Add on the sources for librariesSRCS := $SRCSOBJS := $(addsuffix .o,$(basename $SRCS)#*# Output#*$OUTPUT: $OBJS#$LD -o $ $LDFLAGS $OBJS $LIBS $EXTRA_LIBSar arv -o $ $(OBJS)#*# common rules#*# Rules for compiling source files to object files%.o : %.cpp$CXX -c $CXXFLAGS $INCS $ -o $%.o : %.c$CC -c $CFLAGS $INCS $ -o $dist:bash makedistlinuxclean:-rm -f core $OBJS $OUTPUTdepend:tinyxml.o: tinyxml.h tinystr.htinyxmlparser.o: tinyxml.h tinystr.htinyxmlerror.o: tinyxml.h tinystr.h第3章 系统需求分析为了开发出符合要求的网络聊天程序,首先必须知道使用者的需求。对需求的深入理解是开发工作获得成功的前提条件,它对目标项目提出完整、准确、清晰、具体的要求。鋝岂涛軌跃轮莳講嫗键。3.1服务端3.1.1监听并建立客户端的连接服务器端需要连接用户端,并能提供给这些连接用户所需要的任务处理请求,这就要求服务器能同时处理多个socket连接。服务器模型一般分为循环服务器和并发服务器,循环服务器一次只能处理一个连接,也就是说同一时间只能由一个用户连接到服务器进行消息处理。如果将采用多线程方式的并发服务器来设计服务器端,这样将能从很大程度上提高服务器的运行效率。撷伪氢鱧轍幂聹諛詼庞。服务端在启动之后,需要长时间的运行,初始化所需资源后,对本地端口的进行监听,并接受来自于网络中另一台主机的连接请求。建立与客户端的连接之后,在进行各种信息的传送。踪飯梦掺钓貞绫賁发蘄。服务器端实现的步骤如下:(1)使用socket()函数创建套接字。(2)将创建的套接字绑定到指定的地址结构。(3)listen()函数设置套接字为监听模式,使服务器进入被动打开的状态。(4)接受客户端的连接请求,建立连接。(5)接收、应答客户端的数据请求。(6)终止连接。3.1.2 数据库的增删查改用户的各种信息和系统端的配置文件采用xml文件进行存储。使用xml文件进行存储的优点在于可扩展标记语言”(XML) 提供一种描述结构化数据的方法。与主要用于控制数据的显示和外观的 HTML 标记不同,XML 标记用于定义数据本身的结构和数据类型。婭鑠机职銦夾簣軒蚀骞。XML 使用一组标记来描绘数据元素。每个元素封装可能十分简单也可能十分复杂的数据。您可以定义一组无限制的 XML 标记。例如,您可以定义一些 XML 标记来声明订单中的数据,如价格、税收、发货地址、帐单地址等等。由于 XML 标记在整个单位中以及跨单位采用,因此来自各种不同数据存储区的数据将更容易交换和操作。譽諶掺铒锭试监鄺儕泻。XML 是一种简单、与平台无关并被广泛采用的标准。XML 相对于 HTML 的优点是它将用户界面与结构化数据分隔开来。这种数据与显示的分离使得集成来自不同源的数据成为可能。用户信息、消息记录、好友信息、分组信息和信通端口撇胡子等信息。俦聹执償閏号燴鈿膽賾。对用户信息、消息记录、好友信息和分组信息需要进行数据数据库的增删查改,以实现数据的更新和保存。3.1.3 在线用户的管理当客户端与服务端建立连接之后,服务端需要保存在线的用户信息。当用户退出时,即断开与服务端的连接后,服务端需要不定时的探测或者客户端主动发送断开连接的通知,让服务端知道某客户端已经与服务端断开连接。缜電怅淺靓蠐浅錒鵬凜。3.2客户端客户端是首先调用socket()创建一个未绑定的socket,然后将服务器的socket作为一个地址调用connect()与服务器建立连接。客户端只需要连接到服务器便可以进行任务的处理工作,因此客户端的主要性能要求为聊天时的稳定性和对出错信息的及时反映。当一客户端与服务端建立连接之后,需要完成客户端的用户的注册、用户的登陆验证、用户信息的查询与修改和聊天这几大模块。骥擯帜褸饜兗椏長绛粤。3.3 系统运行状态跟踪系统日志是记录系统中硬件、软件和系统问题的信息,同时还可以监视系统中发生的事件。用户可以通过它来检查错误发生的原因,或者寻找受到攻击时攻击者留下的痕迹。癱噴导閽骋艳捣靨骢鍵。在一个完整的软件系统里面,日志模块是一个非常重要的功能组成部分。它可以记录下系统所产生的所有行为,并按照某种规范表达出来。我们可以使用日志系统所记录的信息为系统进行排错,优化系统的性能,或者根据这些信息调整系统的行为。在安全领域,日志系统的重要地位尤甚,可以说是安全审计方面最主要的工具之一。鑣鸽夺圆鯢齙慫餞離龐。跟踪系统运行状态可在系统发生指明错误是进行及时的错误排查和修正,这些都需要依赖于日志系统,因此,本系统中需要一个日志功能,用于记录系统的运行状态。榄阈团皱鹏緦寿驏頦蕴。第4章 系统设计4.1服务端4.1.1 接收客户端的连接在生活中,A要电话给B,A拨号,B听到电话铃声后提起电话,这时A和B就建立起了连接,A和B就可以讲话了。等交流结束,挂断电话结束此次交谈。 打电话很简单解释了这工作原理:“openwrite/readclose”模式。逊输吴贝义鲽國鳩犹騸。服务端与客户端之间建立连接和通信大致流程如下图所示。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。这些接口的实现都是内核来完成。幘觇匮骇儺红卤齡镰瀉。具体如何实现,均由 linux的内核来实现,可以参考内核源码。4.1.2数据库设计数据库采用文本的方式实现,系统所需要记录的数据采用XML文件来存储。以下是系统数据库数据表的设计:1.用户表User变量名描述类型长度(字节)不为空主键UserName用户名Vchar20YYPassword密码Char32YNNickName昵称Varchar20NNState状态Int81YNIP用户IPString15YNLatestLoginTime最近登录时间DateYNGender性别Int81NNMobile电话Char11NNEmail电子邮箱Varchar50NNImage头像Varchar50NNSignature个性签名Varchar100NNBirthday出生日期DateNN注:(1)密码采用密文存储,经MD5摘要算法对用户名与密码明文拼接后进行计算,产生不可逆的32字符。具体计算公式是Cipher=MD5(UserName+Password);誦终决懷区馱倆侧澩赜。(2)用户名区分大小写,由数字、字母、下划线组成。(3)用户表采用多个XML文件存储,以第一个字符区分。目的是减小数据文件的,提高增删查改数据表的的效率,进而提高系统的效率。文件名为U_X_Time.xml,其中X为用户名首字母,Time为数据表创建的时间。医涤侣綃噲睞齒办銩凛。(4)State用户状态:0下线,1隐身,2忙碌,3在线(5)头像存储头像路径。头像文件存储到服务器端。(6)存储在服务端。(7)存储格式如下:.2.好友表Friend变量名描述类型长度(字节)不为空主键外键约束UserName自己Varchar20YYYFriendName朋友Varchar20YYYType好友类型Int81YNNGroupID分组IDUInt344YNYEstablishTime成为好友时间DateNNN备注:(1)采用多文件存储,以第一个用户名的首字符拼接在一起以示区分。文件名为F_X_ Time.xml。(2)Type好友类型:0普通好友,1星标好友。(3)存储在服务端。(4)存储格式如下:02 2014-05-03 23:54:593.分组表Group变量名描述类型长度(Byte)不为空主键外键约束ID组ID,自增Uint324YYNName分组名称VarChar20YNNUserName用户名称VarChar20YNY备注:(1)表名G_X_Time.xml,X表示创建分组的用户名的首字符,采用多表存储。(2)存储在服务端。(3)存储格式如下:我的好友lvlv4.消息记录表变量名描述类型长度(字节)不为空主键外键约束ID消息标识Int4YYNSender发送者Varchar20YNYReceiver接收者Varchar20YNYSenderHost发送主机(

温馨提示

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

评论

0/150

提交评论