Linux下基于Socket聊天软件的研究与实现.docx
- 文档编号:17613843
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:74
- 大小:296.83KB
Linux下基于Socket聊天软件的研究与实现.docx
《Linux下基于Socket聊天软件的研究与实现.docx》由会员分享,可在线阅读,更多相关《Linux下基于Socket聊天软件的研究与实现.docx(74页珍藏版)》请在冰点文库上搜索。
Linux下基于Socket聊天软件的研究与实现
Linux下基于Socket聊天软件的
研究与实现
小组成员与分工明细5
第1章前言5
1.1系统研究的背景与意义5
1.2即时通讯软件的研究与应用现状5
1.3开发环境简介6
1.3.1Linux系统简介6
1.3.2开发语言及编程工具简介6
1.4TCP/IP协议简介7
1.4.1TCP协议简介7
1.4.2UDP协议简介8
第2章相关技术介绍9
2.1Linux的SOCKET编程介绍9
2.1.1网络中进程之间如何通信9
2.1.2Socket介绍10
2.1.3Socket接口函数10
2.2开源XML解析库简介11
2.2.1TinyXML简介11
2.1.2TinyXML的编译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.3log日志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.3log日志模块的实现46
第6章部署运行50
结论50
小组成员与分工明细
姓名
学号
分工明细
吕吕
201421031059
1.系统架构设计
2.数据库设计
3.服务端编码与测试
4.小组文档第3、4章书写
5.tinyxml的研究与编译
王琥
201421031134
1.需求分析
2.客户端部分编码
3.系统整体测试和测试文档书写
4.小组文档第5、6章、结束书写
5.演示视频录制
黄键华
201421031042
1.需求分析
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.1Linux系统简介
Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。
它能运行主要的UNIX工具软件、应用程序和网络协议。
它支持32位和64位硬件。
Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。
通常所说的Linux,指的是GNU/Linux,即采用Linux内核的GNU操作系统。
GNU代表既是一个操作系统,也是一种规范。
Linux最早由LinusTorvalds在1991年开始编写。
在这之前,RichardStallman创建了FreeSoftwareFoundation(FSF)组织以及GNU项目,并不断的编写创建GNU程序(程序的许可方式均为GPL:
GeneralPublicLicense)。
在不断的有程序员和开发者加入到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得名于计算机业余爱好者LinusTorvalds。
GNU计划和自由软件基金会(theFreeSoftwareFoundation-FSF)于1984年创办。
旨在开发一个类似Unix、并且是自由软件的完整操作系统:
GNU系统。
在Linux平台上运行的软件都是免费使用的,且你可以随意的改动代码部分,只要他们是完全基于GNU的。
1.3.2开发语言及编程工具简介
(1)GNUC++
C++是一门有国家标准的规范编程语言。
最新的C++标准是C++11,指的是ISO/IEC14882:
2011。
C++11标准由国际标准化组织(ISO)和国际电工委员会(IEC)旗下的C++标准委员会(ISO/IECJTC1/SC22/WG21)于2011年8月12日公布[2],并于2011年9月出版。
正在酝酿的C++14标准还未正式发布,不过已箭在弦上,草案已于2014年经过C++标准委员投票,获得一致通过。
对于GNUC++,指的是GNU组织根据C++标准规范实现的C++,相对于VisualC++来说,二者的区别是GNUC++是针对于linux平台上的应用开发而产生的,VisualC++则针对于WINDOWS平台上的应用。
(2)g++
本次系统开发使用的编译器是g++。
g++是由GNU组织开发和发布的开源免费的强大的C++编译器,Linux平台的C++开发,无一例外,基本上使用的都是g++。
其他IT公司在g++的基础之上,也封装了自己的针对自身公司产品的编译器,比如Itel的针对MIC计算卡的icpc,NVIDIA针对GPU的nvcc等等。
gcc/g++在执行编译工作的时候,总共需要4步
●预处理,生成.i的文件[预处理器cpp]
●将预处理后的文件转换成汇编语言,生成文件.s[编译器egcs]
●由汇编变为目标代码(机器代码)生成.o的文件[汇编器as]
●连接目标代码,生成可执行程序[链接器ld]
(3)make与makefile
makefile关系到了整个工程的编译规则。
一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:
Delphi的make,VisualC++的nmake,Linux下GNU的make。
可见,makefile都成为了一种在工程方面的编译方法。
1.4TCP/IP协议简介
1.4.1TCP协议简介
本系统开发所采用的是面向连接的TCP协议,所以我们这里就只对TCP(传输控制协议)这一部分作详细的介绍。
TCP:
传输控制协议(TCP:
TransmissionControlProtocol)
传输控制协议是一个TCP/IP组中能够实现可靠数据传送的传输层协议,并通过顺序响应能实现对应用程序的虚拟连接服务,在必要的时候进行包转发。
与IP协议相结合,TCP代表了网络协议的核心。
大多数网络应用程序是在相同的机器上运行的,计算机上必须能确保目的地的应用程序从源地址处获得数据包,及源计算机上的应用程序的回复获得选择的路经。
这一过程是通过使用TCP的“端口号”完成的。
网络IP地址和端口号的连接要达到唯一的标识,我们称之为“套接字”或“端点”。
为了可靠通信,TCP在端点间建立了连接或虚拟电路。
TCP服务提供了数据流传输、可靠行、有效流控制、全双工操作和多路复用技术等。
关于数据流传输,TCP发送一个由序列号定义的无结构的字节流。
这对应用程序有利,因为在被送出TCP之前应用程序不需要划分成块,TCP可以将字节整合成字段,然后发送给IP。
TCP是面向连接的端到端的可靠协议,并保证传送数据包的顺序,而顺序是用一个响应序号来保证的,这个响应序号告诉接收者发送者期望的下一个包。
如果在规定时间内,没有收到关于这个包的确认响应,则需要重新发送此包。
TCP的可靠机制允许设备处理丢失、删除及读错的包。
暂停机制允许设备监测丢失的包并请求重发。
TCP提供了有效流控制。
当向发送者返回发送确认响应,接收TCP进程就会暗示最高序列号,它能接收并保证不会发生溢出。
全双工操作:
TCP进程能够同时发送和接收包。
TCP中的多路技术:
大量上层同时会话在单连接时进行多路复用。
1.4.2UDP协议简介
UDP(UserDatagramProtocol)协议,即用户数据报协议,主要用来支持那些需要在计算机之间传输数据的网络应用。
包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。
UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天,UDP仍然不失为一项非常实用和可行的网络传输层协议。
与我们所熟知的TCP(传输控制协议)协议一样,UDP协议直接位于IP(网际协议)协议的顶层。
根据OSI(开放系统互连)参考模型,UDP和TCP都属于传输层协议。
UDP协议的主要作用是将网络数据流量压缩成数据报的形式。
一个典型的数据报就是一个二进制数据的传输单位。
每一个数据报的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。
既然UDP是一种不可靠的网络协议,那么还有什么使用价值或必要呢?
其实不然,在有些情况下UDP协议可能会变得非常有用。
因为UDP具有TCP所望尘莫及的速度优势。
虽然TCP协议中植入了各种安全保障功能,但是在实际执行的过程中会占用大量的系统开销,无疑使速度受到严重的影响。
反观UDP由于排除了信息可靠传递机制,将安全和排序等功能移交给上层应用来完成,极大降低了执行时间,使速度得到了保证。
UDP(UserDataProtocol,用户数据报协议)是与TCP相对应的协议。
它是属于TCP/IP协议族中的一种。
如图:
第2章相关技术介绍
2.1Linux的SOCKET编程介绍
2.1.1网络中进程之间如何通信
进程通信的概念最初来源于单机系统。
由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进
程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如
UNIXBSD有:
管道(pipe)、命名管道(namedpipe)软中断信号(signal)
UNIXsystemV有:
消息(message)、共享存储区(sharedmemory)和信号量(semaphore)等.
他们都仅限于用在本机进程之间通信。
网间进程通信要解决的是不同主机进程间的相互通信问题(可把同机进程通信看作是其中的特例)。
为此,首先要解决的是网间进程标识问题。
同一主机上,不同进程可用进程号(processID)唯一标识。
但在网络环境下,各主机独立分配的进程号不能唯一标识该进程。
例如,主机A赋于某进程号5,在B机中也可以存在5号进程,因此,“5号进程”这句话就没有意义了。
其次,操作系统支持的网络协议众多,不同协议的工作方式不同,地址格式也不同。
因此,网间进程通信还要解决多重协议的识别问题。
其实TCP/IP协议族已经帮我们解决了这个问题,网络层的“ip地址”可以唯一标识网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用程序(进程)。
这样利用三元组(ip地址,协议,端口)就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交互。
使用TCP/IP协议的应用程序通常采用应用编程接口:
UNIXBSD的套接字(socket)和UNIXSystemV的TLI(已经被淘汰),来实现网络进程之间的通信。
就目前而言,几乎所有的应用程序都是采用socket,而现在又是网络时代,网络中进程通信是无处不在,这就是我为什么说“一切皆socket”。
2.1.2Socket介绍
应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题。
多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据。
为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字(Socket)的接口。
区分不同应用程序进程间的网络通信和连接,套接字主要有3个参数:
通信的目的IP地址、使用的传输层协议(TCP或UDP)和使用的端口号。
通过将这3个参数结合起来,与一个Socket绑定,应用层就可以和传输层通过套接字接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。
2.1.3Socket接口函数
(1)socket()函数
intsocket(intprotofamily,inttype,intprotocol);//返回sockfdsockfd是描述符。
socket函数对应于普通文件的打开操作。
普通文件的打开操作返回一个文件描述字,而socket()用于创建一个socket描述符(socketdescriptor),它唯一标识一个socket。
这个socket描述字跟文件描述字一样,后续的操作都有用到它,把它作为参数,通过它来进行一些读写操作。
(2)bind()函数
intbind(intsockfd,conststructsockaddr*addr,socklen_taddrlen);
bind()函数把一个地址族中的特定地址赋给socket。
例如对应AF_INET、AF_INET6就是把一个ipv4或ipv6地址和端口号组合赋给socket。
(3)listen()、connect()函数
如果作为一个服务器,在调用socket()、bind()之后就会调用listen()来监听这个socket,如果客户端这时调用connect()发出连接请求,服务器端就会接收到这个请求。
intlisten(intsockfd,intbacklog);
intconnect(intsockfd,conststructsockaddr*addr,socklen_taddrlen);
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操作。
intaccept(intsockfd,structsockaddr*addr,socklen_t*addrlen);//返回连接connect_fd
(5)read()、write()等函数
服务器与客户已经建立好连接了。
可以调用网络I/O进行读写操作了,即实现了网咯中不同进程之间的通信!
网络I/O操作有下面几组:
●read()/write()
●recv()/send()
●readv()/writev()
●recvmsg()/sendmsg()
●recvfrom()/sendto()
(6)close()函数
在服务器与客户端建立连接之后,会进行一些读写操作,完成了读写操作就要关闭相应的socket描述字,好比操作完打开的文件要调用fclose关闭打开的文件。
#include
intclose(intfd);
close一个TCPsocket的缺省行为时把该socket标记为以关闭,然后立即返回到调用进程。
该描述字不能再由调用进程使用,也就是说不能再作为read或write的第一个参数。
注意:
close操作只是使相应socket描述字的引用计数-1,只有当引用计数为0的时候,才会触发TCP客户端向服务器发送终止连接请求。
2.2开源XML解析库简介
2.2.1TinyXML简介
TinyXML是目前非常流行的一款基于DOM模型的XML开源解析器,简单易用且小巧玲珑,非常适合存储简单数据,配置文件,对象序列化等数据量不是很大的操作。
xml文件本质就是小型的数据库,换个角度来说就是,你对数据库有什么操作你对xml文件就应能实现什么操作。
一般而言,对数据库的操作包括以下几种:
新建数据库、查询数据库、修改数据库和删除数据库。
那么对应xml文件就是新建xml文件、查询xml文件的指定节点的值,修改xml文件中节点的值和删除xml文件中节点的值。
本系统中采用xml文件作为数据库来存储用户的相关信息,替代了传统的MySQL和SQLServer数据库,更加的轻便快捷。
其主页是:
,目前最新版本是2.5.3版本。
2.1.2TinyXML的编译
TinyXML由以下几个文件组成:
tinystr.cpp、tinystr.h、tinyxml.cpp、tinyxml.h、tinyxmlerror.cpp和tinyxmlparser.cpp。
编译也是采用makefile进行自动化编译成静态库文件,在系统使用时连接进去。
TinyXML的makefile如下:
#DEBUGcanbesettoYEStoincludedebugginginfo,orNOotherwise
DEBUG:
=NO
#PROFILEcanbesettoYEStoincludeprofilinginfo,orNOotherwise
PROFILE:
=NO
#TINYXML_USE_STLcanbeusedtoturnonSTLsupport.NO,thenSTL
#willnotbeused.YESwillincludetheSTLfiles.
TINYXML_USE_STL:
=NO
#****************************************************************************
CC:
=gcc
CXX:
=g++
LD:
=g++
AR:
=arrc
RANLIB:
=ranlib
DEBUG_CFLAGS:
=-Wall-Wno-format-g-DDEBUG
RELEASE_CFLAGS:
=-Wall-Wno-unknown-pragmas-Wno-format-O3-DTIXML_USE_STL
LIBS:
=
DEBUG_CXXFLAGS:
=${DEBUG_CFLAGS}
RELEASE_CXXFLAGS:
=${RELEASE_CFLAGS}
DEBUG_LDFLAGS:
=-g
RELEASE_LDFLAGS:
=
ifeq(YES,${DEBUG})
CF
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 基于 Socket 聊天 软件 研究 实现