linux多线程编程的聊天软件论文1

上传人:痛*** 文档编号:61484943 上传时间:2022-03-11 格式:DOC 页数:45 大小:977.50KB
收藏 版权申诉 举报 下载
linux多线程编程的聊天软件论文1_第1页
第1页 / 共45页
linux多线程编程的聊天软件论文1_第2页
第2页 / 共45页
linux多线程编程的聊天软件论文1_第3页
第3页 / 共45页
资源描述:

《linux多线程编程的聊天软件论文1》由会员分享,可在线阅读,更多相关《linux多线程编程的聊天软件论文1(45页珍藏版)》请在装配图网上搜索。

1、 编 号: 审定成绩: 重庆邮电大学毕业设计(论文)设计(论文)题目:Linux下多线程编程的聊天软件学 院 名 称 :计算机科学与技术学 生 姓 名 : 李杨专 业 : 信息安全班 级 : 0440803班学 号 : 08130326指 导 教 师 : 蒋贵全(副教授)答辩组 负责人 :方义秋填表时间: 2012 年 5 月重庆邮电大学教务处制 摘 要随着信息时代的发展,网络聊天工具作为当今使用最为广泛的即时通讯工具之一,不但方便了人们随时随地进行在线交流,同时也可进行相互间文件等的传输,给我们的生活带来了诸多的便利,同时它也成为了当今网络应用的一种主流。嵌入式Linux系统被称为专为网络而

2、设计的操作系统,在生活中的应用越来越广泛,为了加强对Linux系统下的编程的各种知识的整合与灵活运用,更加熟悉Linux下的编程操作,所以选择Linux下开发网络聊天工具作为题目是非常有意义的。本文通过对Linux操作系统和多种聊天软件的详细研究,重点研究Linux系统下多线程编程的优缺点,熟悉掌握socket编程的方法,了解并运用TCP、UDP等协议,设计一个功能较为完善的网络聊天软件。软件的主要功能在于实现多个客户端与服务器端之间的信息传递与文件传输功能。实现了注册与登录系统、公聊、私聊、文件传输这四大聊天软件的功能。如何充分发挥Linux网络特性,充分发挥多线程编程的优点,从而开发出高性

3、能的网络聊天软件,是本次设计的重点和难点。【关键词】Linux操作系统 聊天软件 多线程ABSTRACTWith the remarkable development of information technology, the application of network chat is becoming one of the most extensive way to instant messaging. People not only can communication with each other online anytime and anywhere and also can tr

4、ansfer the files easily. It is bring us a lot of convenience, at meantime its becomes the mainstream of network applications nowadays. The Embedded Linux System is designed for operating system, and its widely used during the normal life. In order to enhance the capacity of integrative knowledge and

5、 apply flexible of the Embedded Linux System and more familiar with the programming operations, so choose the application of network chat that developed by Linux as the subject is very significant.In this paper, the advantages and disadvantages of the Linux operating system and a detailed study of a

6、 variety of chat software, focus on the Linux system, Multi-threaded programming, familiar with socket programming, to understand and use protocols such as TCP, UDP, design a functional network chat software. The softwares main function is to implement the transmission of information between multipl

7、e client-side and server-side file transfer capabilities. Registration and login systems, public chat, private chat, file transfer function of these four chat software.How to give full play to the Linux networking features, and give full play to the advantages of multithreaded programming, in order

8、to develop high-performance network chat software is the key and difficult points of the design. 【Key words】Linux operating system Instant messenger Multi-threaded目 录前 言IV第一章 绪 论VI第一节 聊天软件的产生与发展VI第二节 即时聊天软件主要功能及原理VI一、即时通讯的原理VI二、即时聊天软件主要功能VII第三节 聊天软件的未来发展VIII第二章 软件开发的技术介绍IX第一节 Linux操作系统介绍IX一、Linux的产生

9、IX二、Linux的发展X三、Linux操作系统的特点X第二节 TCP、UDP通信和客户/服务器模型概念XI一、 UDP通信简介XI二、 TCP通信简介XI三、客户/服务器模型XIII第三节 网络套接字(socket)简介XIV一、Socket的定义XIV二、Socket现象解释XIV三、Socket的连接过程XV四、常用的Socket类型XV第四节 多线程技术简介XVII一、线程的概念XVII二、多线程的基本特点XVII三、线程与进程的区别XVIII四、多线程的优点XVIII第三章 软件的总体设计XX第一节 软件的总体设计XX一、 软件系统需求分析XX二、软件总体设计XXI三、软件总体功能X

10、XII第二节 软件的各个模块详细设计XXIII一、注册、登陆功能XXIII二、公聊功能XXIV三、私聊功能XXV四、文件传输功能XXV五、程序流程图XXVI第四章 软件编译过程及测试结果XXVIII第一节 软件的编译过程XXVIII一、软件编译环境XXVIII二、编译软件XXVIII第二节 软件的测试结果XXIX总 结XXXII致 谢XXXIII参考文献XXXV附 录XXXVI一、英文原文XXXVI二、英文翻译XLI前 言 在网络无所不在的今天,在Internet上,有ICQ、MSN、Gtalk、OICQ等网络聊天软件,极大程度上方便了处于在世界各地的友人之间的相互联系,也使世界好像一下子缩小

11、了,不管你在哪里,只要你上了网,打开这些软件,就可以给你的朋友发送信息,不管对方是否也同时在线,只要知道他的号码。Linux 操作系统作为一个开源的操作系统被越来越多的人所应用,它的好处在于操作系统源代码的公开化。只要是基于GNU公约的软件你都可以任意使用并修改它的源代码。但对很多习惯于Windows操作系统的人来说,Linux的操作不够人性化、交互界面不够美观,这给Linux操作系统的普及带来了很大的阻碍。因此设计一个基于Linux操作系统下的拥有人性化界面的实时通讯工具是十分必要的。而使用网络套接字socket和多线程在网络中的应用,是设计实和现此聊天软件所必需的。线程(thread)技术

12、早在60年代就已经被提出,但真正将多线程应用到操作系统当中是在80年代。在早期的Unix系统中也支持线程的概念,但当时一个进程中只允许有一个线程。但现在多线程技术已经被多种操作系统所支持,当然其中也包括Linux操作系统。因此此次设计的聊天软件不但要实现聊天软件的多项基本功能,使得软件在Linux操作系统下的运行简单、流畅,更加要合理利用多线程技术以及网络套接字socket技术保证软件的高性能。第1章 绪 论 第一节 聊天软件的产生与发展即时通讯(Instant Messenger,简称IM)软件可以说是目前世界上网用户使用率最高的软件,无论是老牌的ICQ,还是国内用户量第一的腾讯QQ,以及微

13、软的MSN Messenger都是大众关注的焦点,它们能让你迅速地在网上找到你的朋友或工作伙伴,可以进行实时交谈和信息的互相传递。而且,现在不少IM软件还集成了数据交换、语音聊天、网络会议、电子邮件的功能。目前在互联网上受欢迎的即时通讯软件包括QQ、MSN Messenger、百度hi、AOL Instant Messenger、NET Messenger Service、Jabber、ICQ等。 聊天一直是网民们上网的主要活动之一,但是聊天软件的发展历史并不久远,但是它一诞生,就立即受到网民的喜爱,并风靡全球。即时通讯的出现并非“自然地崛起”,在它的发展史上,以色列人是功不可没的。正是四位以

14、色列籍的年轻人,在1996年7月成立的Mirabilis公司,并于同年11月推出了全世界第一个即时通讯软件ICQ,取意为“我在找你”“I Seek You”,简称ICQ。目前,国内最为流行的即时通讯软件是OICQ,简称QQ。出身于著名寻呼企业润讯的马化腾最初做的只是与寻呼业相关的ICQ软件。只是当电信寻呼、联通寻呼、润迅寻呼等大寻呼企业都用上了这种网络寻呼机,给马化腾他们赚来了第一桶金后,腾讯瞄上了在国外正热的互联网产业。1999年,腾讯正式开始提供互联网的即时通讯服务。第二节 即时聊天软件主要功能及原理一、即时通讯的原理TCP/IP和UDP(用户数据报协议)是建立在更低层的IP协议上的两种通

15、讯传输协议。TCP/IP是以数据流的形式,将传输数据经分割、打包后,通过两台机器之间建立起的虚电路,进行连续的、双向的、严格保证数据正确性的文件传输协议而UDP是以数据报的形式,对拆分后的数据的先后到达顺序不做要求的文件传输协议。从技术上讲,聊天软件主要分为基于服务器的IM工具软件和基于P2P技术的IM工具软件。以腾讯QQ举例来说,QQ就是使用UDP协议进行发送和接收“消息”的。当你的计算机安装了QQ软件的客户端之后,实际上,你既是服务端(Server),同时也是客户端(Client)。当你登录QQ客户端时,你的QQ作为Client连接到腾讯公司的主服务器上,当你“看谁在线”时,你的QQ又一次

16、作为Client从QQ Server上读取在线网友名单。当你和你的网络伙伴进行聊天时,如果你和对方的连接比较稳定,你和他的聊天内容都是以UDP的形式,在计算机之间传送。如果你和对方的连接不是很稳定,QQ服务器将为你们的聊天内容进行中转。其他的即时通信软件原理与此大同小异。简单来说就是: 1、用户首先从QQ服务器上获取好友列表,以建立点对点的联系; 2、用户Client1和好友Client2之间采用UDP方式发送信息; 3、如果无法直接点对点联系,则用服务器中转的方式完成。二、即时聊天软件主要功能就大多数的聊天软件,主要功能有:文字聊天:文字聊天功能是聊天软件最基本、也是最重要的功能,基本上每一

17、种聊天软件在这个功能上的操作都差不多:如果用户想与联系人进行聊天,可以双击联系人的头像,在弹出的对话框中敲入文字信息发送即可,在聊天过程中还可以使用各种漂亮的表情图标为聊天添加了不少情趣。大多数的聊天软件可以给不在线的朋友发送信息,对方下次上线的时候可以收到。 语音聊天: 如果打字聊天的方式已不能满足需求,那么聊天软件还支持的实时语音聊天,首先计算机得配有音箱或者耳机、麦克风,然后就可以向网友发送连接“语音聊天”的请求,通过后双方不仅可以用文字聊天,还可以直接讲话。如今例如QQ等聊天软件还有传送语音功能,利用此功能可以传送语音信息。传送文件: 聊天软件能点对点的传输文件,有时候利用此功能要比使

18、用E-mail还方便许多,当然此项功能必须在对方在线时才能使用。如今的文件传送功能还支持断点续传的功能,不必担心文件传送过程中发生突然中断的情况。视频聊天: 如果你的网速够快,又有摄像头的话,完全可以用聊天软件来代替掉Net-meeting,在聊天的同时,不仅可以通话,还可以看到对方的图像,表情,备感亲切,给使用者带来一份全新的感受。邮件辅助: 聊天软件和E-mail是我们在网上最常用的两种工具,如今不少聊天软件软件将两者作了完美的结合。我们可以直接给自己的好友发邮件,而无须再输入E-mail地址;此外对于自己的信箱还有检查新邮件功能,在“系统参数”中设置您自己的E-mail,便可以选择定时检

19、查时间,软件会自动检查有否新邮件到达。在使用过程中如果您的邮箱中有了新邮件,马上会冒出一个提示窗。第三节 聊天软件的未来发展任何一款免费软件的使用过程中,都会被强制地安插进一些广告内容,聊天软件也不例外。虽然这是十分常见的现象,但是对于使用者来说却是十分让人反感的。对于这一点,微软公司就做得很好。无论是Windows XP中捆绑的MSN,还是网上免费下载的,几乎看不到广告的影子。就软件开发来说,怎样更加完善软件功能的同时,又保证用户的使用感受是十分重要的。 目前,伴随着3G技术的广泛运用聊天软件与各种移动终端设备的结合也越来越多。使用聊天软件向手机发送短信,各种聊天软件也开发出了手机上的客户端

20、。手机增值服务与网络增值服务的相互联系,也是未来聊天软件发展的很重要的一部分。第2章 软件开发的技术介绍第一节 Linux操作系统介绍一、Linux的产生Linux操作系统是一种针对PC计算机和工作站的操作系统,它具有像Windows和Mac那样的功能齐全的图形用户界面(GUI,Graphical User Interface)。Linus Torvald和其它的遍布世界各地的编程人员共同开发的。作为一种操作系统,它具有与Unix,Mac,Windows和Windows NT同样的功能。 提到Linux我们不能不提GNU和Unix。Richard M.Stallman建立的自由软件联盟出版了两

21、种许可证,GNU通用公共许可证(GNU Gneral Public License,GPL)和GNU函数库通用公共许可证(GNU Library Gneral Public License,LGPL)。大部分GNU工程的软件和文档是以GNU通用公共许可证发行的,但是有一些库是以GNU函数库通用公共许可证发行的。按照GNU通用公共许可证的规定,Linux的源代码可以自由获取,这满足了我们学习该系统的强烈愿望。GPL充分体现了Stallman的思想:只要用户所做的修改是同等自由的,用户可以自由地使用、拷贝、查询、重用、修改甚至发布这个软件。通过这种方式,GPL保证了Linux(以及同一许可证下的大

22、量其他软件)不仅现在自由可用,而且皮后经过任何修改这后都仍然可以自由使用。 Unix是由ATT贝尔实验室的Ken Thompson和Dennis Ritchie于1969年在一台已经废弃了的PDP-7上开发的;最初它是一个用汇编语言写成的单用户操作系统。后来,他们又在PDP-11上用C语言重新编写(发明C语言的部分目的就在于此),把Unix做成为了一个文本处理系统,这使Unix在贝尔实验室得到广泛的应用。Unix的最初版本免费提供给许多知名的大学的计算机系使用。加州大学伯克利分校的计算机系就是其中的一名,并地Unix进行了修改增加了许多新的特点,这就是主为人知的BSC版本的Unix。与此同时,

23、其它独立开发的Unix版本也开始萌生。Unix不断发展了,各种版本被应用到不同的计算机使用。而Linux最初是专门为基于Intel的个人计算机设计的。二、Linux的发展Linux的昨天 1991年,一名叫Linus Torvalds的芬兰大学生对Unix各种版本对于80386类的机器的脆弱支持十分不满,他决定要开发出一个全功能的、支持POSIX标准的、类Unix的操作系统内核,该系统吸收了BSD和System V 的优点,同进摒弃了它们的缺点。他独立把这个内核开发到0.02版,这个版本已经可以运行gcc、bash和很少的一些应用程序。后来,他又开始了在因特网上寻求广泛的帮助。 1994年,L

24、inux已经升级到1.0版本。它的源代码量也呈指数形式增长,实现了基本的TCP/IP功能,此时Linux已经拥有大约10万的用户。Linux的今天 作为一各服务器级的操作系统,Linux已经成熟了。现在的Linux内核由150多行代码组成,能作为Web服务器平台,也为越来越多的商业用户提供文件和打印服务。它既被当作邮件服务器的一种候选平台,也被当作一种强壮而安全的防火墙。 Linux的企业级特性,比如支持多处理器、支持大型文件系统、日志文件系统以及密集型计算和高可用性集群技术,也逐步成熟。 桌面上的Linux也在继续完善。KDE桌面提供的图形用户界面在易用性和可配置方面都能和微软的Window

25、s相媲美。Linux的明天 Linux最强大的生命力在于其公开的开发过程。每个人都有可以自由获取内核源程序,每个人都有要不得以运载源程序加以修改,而后他人也可以自由获取你修改后的源程序。Linux这种独特的自由流畅的开发模型已被命名为bazaar(集市模型)。Bazaar开发模型通过重视实验,征集并充分利用早期的反馈,对巨大数量的脑力资源进行平衡配置,可以开发出更优秀的软件。本联盟就是想通过bazaar开发模型,在网上召集一些Linux的爱好者,开发出更优秀的操作系统或软件。三、Linux操作系统的特点Linux的流行是因为它具有许多诱人之处。 Linux是一款免费的操作系统,用户可以通过网络

26、或其他途径免费获得,并可以任意修改其源代码。这是其他的操作系统所做不到的。正是由于这一点,来自全世界的无数程序员参与了Linux的修改、编写工作,程序员可以根据自己的兴趣和灵感对其进行改变。这让Linux吸收了无数程序员的精华,不断壮大。同时Linux支持多用户,各个用户对于自己的文件设备有自己特殊的权利,保证了各用户之间互不影响。多任务则是现在电脑最主要的一个特点,Linux可以使多个程序同时并独立地运行。Linux采取了许多安全技术措施,其中有对读、写进行权限控制、审计跟踪、核心授权等技术,这些都为安全提供了保障。Linux可以运行在多种硬件平台上,此外Linux还是一种嵌入式操作系统,可

27、以运行在掌上电脑、机顶盒或游戏机上。第二节 TCP、UDP通信和客户/服务器模型概念一、 UDP通信简介 UDP是用户数据报协议的简称。它是以中午连接的逻辑通信信道。UDP在传送数据之前不需要先建立连接,远地主机的传输层在收到udp数据报后,不需要给出任何确认,所以不能保证其交付时可靠。它的特点是:因无连接,故提供的是不可靠的信道,但也是因无连接而具有很好的传输效率。 二、 TCP通信简介TCP是传输控制协议的简称,它是提供一条全双工的、可靠的信道。在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的传输层。不同主机的应用层之间经常需要可靠

28、的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分割成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传送单元MTU的限制)。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。TCP为了保证不发生丢包,就给每个字节一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的字节发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据(假设丢失了)将会被重传。TCP用一个校验和函数来检验

29、数据是否有错误;在发送和接收时都要计算和校验。首先,TCP建立连接之后,通信双方都同时可以进行数据的传输,其次,它是全双工的;在保证可靠性上,采用超时重传和捎带确认机制。在流量控制上,采用滑动窗口协议,协议中规定,对于窗口内未经确认的分组需要重传。在阻塞控制上,采用广受好评的TCP拥塞控制算法(也称AIMD算法),该算法主要包括三个主要部分:1,加性增、乘性减;2,慢启动;3,对超时事件做出反应。TCP提供面向连接的服务,在传送数据之前必须先建立连接,数据传送结束后要释放连接。TCP不提供广播和多播服务。由于TCP要提供可靠的、面向连接的运输服务,所以不可避免地增加了许多系统开销,比如确认、流

30、量控制、计时器以及连接管理等都需要占用许多系统的时空资源。 两个计算机之间如果使用TCP通信,其连接过程需要三次握手实现,如实验图2-1所示。图2-1 用三次握手建立TCP连接 对于两个计算机之间连接的释放过程也需要类似的3次握手的互相确认的过程,如实验图2-2所示。图2-2 TCP连接的释放过程三、客户/服务器模型在客户/服务器模型中,多个相互通信的计算机都作为客户端,与网络服务器进行连接,并通过服务器进行信息的传递。所以多个客户端之间的通信就变为了客户端与服务端的通信。所以,采用客户/服务器模型进行网络聊天需要分别编写服务器端和客户端的程序,服务器和客户端之间相互通信的同步关系和各自的程序

31、流程如实验图2-3所示。图2-3 Socket通信流程图第三节 网络套接字(socket)简介一、Socket的定义socket的英文原义是“孔”或“插座”。作为4BDS UNIX的进程通信机制,取后一种意思。通常也称作套接字,用于描述IP地址和端口,是一个通信链的句柄。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原意那样,象一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。

32、客户软件将插头插到不同编号的插座,就可以得到不同的服务。应用程序通常通过套接字向网络发出请求或者应答网络请求。以J2SDK-1.3为例,Socket和Server Socket类库位于java .net包中。Server Socket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是Server Socket它们的工作都是通过SocketImpl类及其子类完成的。二、Socket现象解释在 系统中

33、,一般用户只能感受到本地 机和对方 号码的存在,建立通话的过程,话音传输的过程以及整个 系统的技术细节对他都是不透明的,这也与socket机制非常相似。socket利用网间网通信设施实现进程通信,但它对通信设施的细节毫不关心,只要通信设施能提供足够的通信能力,它就满足了。至此,我们对socket进行了直观的描述。抽象出来,socket实质上提供了进程通信的端点。进程通信之前,双方首先必须各自创建一个端点,否则是没有办法建立联系并相互通信的。正如打 之前,双方必须各自拥有一台 机一样。在网间网内部,每一个socket用一个半相关描述:一个完整的socket有一个本地唯一的socket号,由操作系

34、统分配。最重要的是,socket 是面向客户/服务器模型而设计的,针对客户和服务器程序提供不同的socket系统调用。客户随机申请一个socket (相当于一个想打 的人可以在任何一台入网 上拨号呼叫),系统为之分配一个socket号;服务器拥有全局公认的 socket ,任何客户都可以向它发出连接请求和信息请求(相当于一个被呼叫的 拥有一个呼叫方知道的 号码)。socket利用客户/服务器模式巧妙地解决了进程之间建立通信连接的问题。服务器socket 半相关为全局所公认非常重要。读者不妨考虑一下,两个完全随机的用户进程之间如何建立通信?假如通信双方没有任何一方的socket 固定,就好比打

35、的双方彼此不知道对方的 号码,要通话是不可能的。三、Socket的连接过程Socket接口上TCP/IP网络应用程序接口(API),它提供了许多函数和例程,程序员可以使用它们来开发TCP/IP网络应用程序。使用Socket接口进行网络通信的过程如图1-3所示,简要步骤如下:1、建立一个Socket.2、按要求配置socket,将socket连接到远程主机或给socket指定以各本地协议端口。3、按要求通过socket发送和接受数据。4、关闭此socket。这是通过Socket实现点对点通信需要掌握的4个编程要点。四、常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据

36、报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。Socket为了建立Socket,程序可以调用Socket函数,该函数返回一个类似于文件描述符的句柄。socket函数原型为:int socket(int domain,int type,int protocol);domain指明所使用的协议族,通常为PF_INET,(其与addrinfo 里的 AF_INET在现在看来是相同的。只是历史上人们曾构想将AF(地址家族address family)与PF(pro

37、tocol family 协议家族)分开,但实际上这种区分并未真正推广,所以现在AF_INET和PF_INET具有相同的意义。其中AF_INET是基于IPv4而AF_INET基于IPv6)表示互联网协议族(TCP/IP协议簇);type参数指定socket的类型:SOCK_STREAM 或SOCK_DGRAM,Socket接口还定义了原始Socket(SOCK_RAW),允许程序使用低层协议;protocol通常赋值0。Socket()调用返回一个整型socket描述符,你可以在后面的调用使用它。Socket描述符是一个指向内部数据结构的指针,它指向描述符表入口。调用Socket函数时,soc

38、ket执行体将建立一个Socket,实际上建立一个Socket意味着为一个Socket数据结构分配存储空间。Socket执行体为你管理描述符表。两个网络程序之间的一个网络连接包括五种信息:通信协议、本地协议地址、本地主机端口、远端主机地址和远端协议端口。Socket数据结构中包含这五种信息。socket在测量软件中的使用也很广泛。 上述点对点通信的实现知识完成了主机进程与服务器进程之间的连接,建立连接的进程之间是一对一的联系,即主机的一个进程与服务器的一个进程之间建立的连接。而每个进程进行通信的环节都包括了发送信息和接口信息两个任务,这两个任务通过一个端口地址发送和接收。 对于多个并发的任务需

39、要创建多个线程或线程去实现。使用一个进程去完成发送信息是没有问题的,因为发送总是主动的;而使用同一个进程再去完成接受信息去不一定会成功,因为接受信息是被动的,所以当没有信息可以接收时,该进程就会被阻塞,从而导致发送任务也一起被阻塞。同一个端口的发送和接收是两个并发任务,应该由两个不同的任务去分别完成信息的发送和接收。这样,当接收信息任务因没有信息而被阻塞时,不至于影响发送任务的执行。在网络通信中,端口地址是以进程为单位进程分配的,而一个进程与外界的消息发送与接收必须通过分配给它的同一个端口进行。因此,不能通过创建进程方式来解决上诉问题,因为两个进程会分别对应两个不同的端口,而发送和接收必须使用

40、同一端口。线程不是资源分配的单位,所以如果使用两个线程不会对线程分配新的端口。因此,本实验需要使用两个线程去分别完成发送和接收信息的任务,这两个线程共享其进程拥有的统一个端口地址。由于创建进程的进程本身会作为一个线程来调度,所以只需要再创建一个线程专门负责接收信息就可以了。因此,对于从每个客户端发来的请求,服务器端都要创建相应的线程去接收并处理;同理,对于客户端而言,也要创建一个线程去读取服务器端发来的信息。第四节 多线程技术简介一、线程的概念线程(thread)是进程中某个单一顺序的控制流。也被称为轻量进程(lightweight processes)。计算机科学术语,指运行中的程序的调度单

41、位。线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。每一个程序都至少有一个线程,那就是程序本身。线程是程序中一个单一的顺序控制流程。在

42、单个程序中同时运行多个线程完成不同的工作,称为多线程。 二、多线程的基本特点在多线程中,通常是在一个进程中包括多个线程,每个线程都是作为利用CPU的基本单位,是花费最小开销的实体。线程具有以下属性。轻型实体。线程中的实体基本上不拥有系统资源,只是有一点必不可少的、能保证独立运行的资源,比如,在每个线程中都应具有一个用于控制线程运行的线程控制块TCB,用于指示被执行指令序列的程序计数器、保留局部变量、少数状态参数和返回地址等的一组寄存器和堆栈。 独立调度和分派的基本单位。在多线程OS中,线程是能独立运行的基本单位,因而也是独立调度和分派的基本单位。由于线程很“轻”,故线程的切换非常迅速且开销小。

43、可并发执行。在一个进程中的多个线程之间,可以并发执行,甚至允许在一个进程中所有线程都能并发执行;同样,不同进程中的线程也能并发执行。共享进程资源。在同一进程中的各个线程,都可以共享该进程所拥有的资源,这首先表现在:所有线程都具有相同的地址空间(进程的地址空间),这意味着,线程可以访问该地址空间的每一个虚地址;此外,还可以访问进程所拥有的已打开文件、定时器、信号量机构等。 三、线程与进程的区别 线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文。多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定。线程的

44、运行中需要使用计算机的内存资源和CPU。通常在一个进程中可以包含若干个线程,它们可以利用进程所拥有的资源。在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位。由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度,从而显著提高系统资源的利用率和吞吐量。 线程与进程的区别可以归纳为以下几点: 地址空间和其它资源(如打开文件):进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。 通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信需要

45、进程同步和互斥手段的辅助,以保证数据的一致性。调度和切换:线程上下文切换比进程上下文切换要快得多。在多线程OS中,进程不是一个可执行的实体。 四、多线程的优点为什么有了进程的概念后,还要再引入线程呢?使用多线程到底有哪些好处?什么的系统应该选用多线程呢?使用多线程的理由之一是和进程相比,它是一种非常节俭的多任务操作方式。在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种昂贵的多任务工作方式。而运行于一个进程中的多个线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间

46、,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。据统计,总的说来,一个进程的开销大约是一个线程开销的30倍左右,当然,在具体的系统上,这个数据可能会有较大的区别。使用多线程的理由之二是线程间方便的通信机制。对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过通信的方式进行,这种方式不仅费时,而且很不方便。线程则不然,由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便。当然,数据的共享也带来其他一些问题,有的变量不能同时被两个线程所修改,有的子程序中声明为static的数据更有可能给多线程程序带来灾难性的打击,这些正

47、是编写多线程程序时最需要注意的地方。除了以上所说的优点外,不和进程比较,多线程程序作为一种多任务、并发的工作方式,当然有以下的优点: 提高应用程序响应。这对图形界面的程序尤其有意义,当一个操作耗时很长时,整个系统都会等待这个操作,此时程序不会响应键盘、鼠标、菜单的操作,而使用多线程技术,将耗时长的操作(time consuming)置于一个新的线程,可以避免这种尴尬的情况。 使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上。改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。第3章

48、软件的总体设计 第一节 软件的总体设计1、 软件系统需求分析1、需求分析这款聊天软件是基于Linux系统下采用多线程的方法开发的。此聊天系统适用于大多数用户,对用户的操作能力要求较低。同时该系统拥有资源占有少,运行速度快的特点。软件主要由用户登录界面、聊天室界面、私聊界面、创建/查找界面等构成,设计简单明了,使用方便。满足了用户一对一、一对多聊天,文件传输等的要求。2 可行性研究Socket是介于应用层和传输层之间的编程接口,套接字接口提供了访问下层通信协议的大量系统调用和相应的数据结构。在Linux中,套接字接口是应用程序访问下层的网络协议的唯一方法。具体讲,套接字在用户级实现了两个应用程序

49、之间的网络连接和数据交换,所以Linux中的套接字意味着网络上的连接。套接字在TCP/IP网络模型中的地位,如图3-1所示。图3-1 Socket在TCPIP 网络模型中的示意图Linux多线程设计是指基于Linux操作系统下的多线程设计,包括多任务程序的设计,并发程序设计,网络程序设计,数据共享等。Linux系统下的多线程遵循POSIX线程接口,称为pthread。编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a。二、软件总体设计1、模块调用关系 各模块间调用关系如图3-2所示:注册(未注册用户入口)登录公聊私聊文件传输已注册用户入口图

50、3-2 各模块间调用关系2、功能需求与系统模块的关系功能需求与系统模块的关系表如表3-3所示:注册登录模块公聊模块私聊模块文件传输模块用户注册用户登陆系统广播上下线提示用户私聊文件传输服务器踢出用户表3-3功能需求与系统模块关系表三、软件总体功能系统主要实现四大网络聊天,功能如图3-4所示:注册与登录;公聊;私聊;文件传输图3-4聊天室功能图系统分为服务器端程序和客户端程序。服务器端建立好socket,等待连接,当有客户端连接服务器的时候,服务器接收连接,并接受客户端发送过来的消息,根据接收到的结构体所携带的协议来做相应的功能。服务器端所实现的功能有:踢出指定用户;关闭服务器;显示在线用户。如

51、图3-5所示:图3-5 服务器端功能客户端首先获得服务器的IP地址,然后创建一个socket,调用connect函数与服务器建立连接,连接成功之后接收从服务器发送过来的数据。客户端所实现的功能有:登录,登录后可以通过发送不同的客户服务器之间协议来实现各种操作(公聊、私聊、传输文件);注册;退出系统。如图3-6所示:图3-6客户端功能第二节 软件的各个模块详细设计一、注册、登陆功能服务器端服务器端建立好socket,等待连接,当有客户端连接服务器的时候,服务器接收连接,并接受客户端发送过来的消息,根据接收到的结构体所携带的协议来做相应的功能。注册:如果协议为reg,则为客户端注册,首先将发送过来

52、的结构体,提取用户名和密码,然后需要对用户名合法性检验,验证之后如果用户名合法则将用户信息保存到文件中,合法性的规则包括用户名不能重复和不能使用all等协议作为用户名,并且用户名和密码都不能为空。如果注册成功,将用户信息写入user.txt,并给客户端发送一个消息如“注册成功”,同样将消息保存在一个结构体里。如果失败,也给客户端发送一个消息如“您输入的用户名不能为all”或者“用户名XX已经存在”。登录:如果协议为login,则将用户名和密码信息提取,再遍历存放用户信息文件里的用户名和密码,直到验证成功为止,如果验证成功则对所有在线的用户发送一条消息:“提示XX用户登录成功”;如果失败则只给登

53、陆失败的客户端提示登录失败,并给出原因,如“用户名不存在”或者“用户名或者密码输入错误”,并跳转到相应的代码执行其他功能。成功则等待发送客户端消息,失败则关闭socket并结束线程。踢出客户端:通过查看和修改绑定的socket,结合在线用户队列实现查看和踢出在线用户,踢出用户后向被踢出用户发送相关信息。客户端:客户端的输入和消息的显示要使用2个终端,一个client,一个是display。client终端为输入的界面,在这个界面里,新建一个线程来接受服务器端发来的消息,再添加时间信息,并将这些信息写入文件chatlog.txt,然后给display进程发送一个消息,display进程接到消息,

54、就去读取文件,并将这些数据显示在display终端。打开客户端client终端界面,有3个菜单:注册、登陆、退出,选择相应项即可进行相关操作。二、公聊功能服务器端:如果是公聊,则到链表里取得所有用户的客户端信,服务器再发送给所有接受消息的客户端。接受信息的客户终端就会先将信息保存到聊天记录的文件里,并显示接收到的信息,并且信息前面会显示相应的提示符。客户端:客户端在登陆成功之后,默认就是all协议,可以直接发送公聊消息,不需要加上任何的协议,实现对所有人的人进行聊天。命令为all$message,给所有人发送消息。在display终端则显示消息内容,如“who发来的公聊消息:xxxx”。三、私

55、聊功能服务器端:如果是私聊,则根据客户端要发送到哪个用户的用户名,到user.txt文件的链表里取得该用户名的客户端信息,服务器再发送给相应的接受信息的客户端。接受信息的客户终端就会先将信息保存到聊天记录的文件里,并显示接收到的信息,并且信息前面会显示相应的提示符。客户端:客户端在登陆成功之后,在发送消息之前可以先查看在线用户列表,查看用户列表使用view$。接着,可以使用who$message的形式发送私聊信息,意味着,这个消息是发送给who的。消息都加上协议who来封装成结构体,再发送给服务器端。在display终端则显示消息内容,如“who发来的私聊消息:xxxx”。四、文件传输功能服务

56、器端:根据协议,先给接收的客户端发送一条消息为trans标记:xx用户给您发送了xx文件,是否同意接受?agree(同意)disagree(不同意)。当客户端按下disagree,则返回一条消息给服务器端,服务器端同时告诉发送的客户端,对方拒绝接受文件。发送端可以接着继续做其他的事情,私聊或者公聊。当接收的客户端按下agree,并提示保存的文件名。输入完毕,就可以接受文件了。客户端返回一条消息给服务器端,服务器端同时返回一条消息给发送的客户端,告诉客户端对方同意接受文件。这时候,文件开始传输,发送完毕后,发送的客户端会显示传输完毕。传输的文件是任意的文件,不仅仅是文本文件,图片也可以。客户端:

57、发送端:如果某个客户端想发送文件给其他客户端,则直接使用命令trans$who$filename。(filename包括本地的路径和文件名)trans为协议,就是标志为传输文件。who就是发送给谁。filename就是要发送的文件在本地的文件名。接收端:首先显示xx用户给您发送了xx文件,是否同意接受?agree(同意)disagree(不同意)。使用命令trans$agree则同意接收;trans$disagree则不同意接收。五、程序流程图服务器端文件:server.c。其程序流程图如图3-5所示: 客户端的输入端文件为:client.c客户端的显示端文件为:display其程序流程图如图

58、3-6所示:图3-6客户端程序流程图第4章 软件编译过程及测试结果第1节 软件的编译过程一、软件编译环境linux、unix、debian等操作系统。二、编译软件putty、vmware虚拟机 在编写完TCP服务端程序server.c后,用 gcc lpthread o server.c server 生成程序server。 在编写完TCP客户端程序client.c后,用gcc lpthread o client.c client 生成程序client 在主机上打开一窗口,运行server。 再打开另一个窗口或者在另一个主机上打开一个窗口,运行client,输入服务器的IP地址,并检查器结果的

59、正确性。 为简化修改源程序后重复而繁琐的编译操作,我写了个简单的MakeFile文件。内容如图4-1所示:图4-1MakeFile文件编译结果如图4-2所示:图4-2编译结果第2节 软件的测试结果软件测试结果服务器端显示,如图4-3所示:图4-3服务器端显示客户端注册,如图4-4所示:图4-4客户端注册客户端登录、私聊、公聊、查看在线人数,如图4-5、4-6所示:图4-5客户端登录、私聊、公聊图4-6查看在线人数display端显示,如图4-7所示:图4-7 display端显示传输文件的发送端和接收端,如图4-8、4-9所示:图4-8传输文件的发送端图4-9传输文件的接收端总 结网络聊天工具

60、作为当今使用最为广泛的即时通讯工具之一,不但方便了人们随时随地进行在线交流,同时也可进行相互间文件等的传输,给我们的生活带来了诸多的便利,同时它也成为了当今网络应用的一种主流。而Linux操作系统在生活中的应用越来越广泛,所以选择Linux下开发网络聊天工具作为题目是非常有意义的。本次毕业设计顺利完成了Linux下聊天室工具的设计,实现了包括注册、登记,私聊,公聊,传送文件等功能,其中聊天时可用英文以及中文聊天;传送文件时可以传送文本、图片等各种格式的文件,功能相对比较强大。利用到LINUX的socket网络编程知识和大量编程技,编过程中不断用tcpdump,netstat,losf等网络调试

61、工具进行调试程序。经过近了几个月的设计和开发,网络聊天室的设计设计完毕。其功能已基本符合用户需求,能够简单的网络聊天功能。但是仍然有一些不尽如人意的地方,还有待于进一步完善其功能。在Linux下开发高性能的网络通信程序,是充分发挥Linux网络特性的一个关键因素。在这个实例中,对Linux系统下编程的各种知识点的整合与灵活运用,使我更加熟悉Linux下的编程操作。通过上网查阅资料,图书馆查书,向指导老师请教,不断的进行程序的调试,也使我真正的理解到,理论与实践之间还是有很大的距离,在以后的学习与工作中,更要不断的完善自己的知识体系结构,注意理论与实践的结合,学知识关键是要学活,而不能死记死搬书

62、本上的知识,关键是要会灵活应用,这样所学到的东西才真正的学以致用,才能达到学习的真正目的!致 谢光阴似箭,日月如梭。在美丽的重庆邮电大学我度过了人生中最宝贵的四年时间。这四年是最真诚的青春,最纯真的岁月,最美丽的大学生活在校训“修德、博学、求实、创新”的高度贯彻下,在所有老师的辛勤付出和谆谆教诲下,在同学朋友的大力支持下,在父母关心疼爱下,我终于成为一个有着成熟人生观、正确价值观、厚重是世界观的合格的大学毕业生。在此,我衷心感谢蒋贵全副教授在我大学的最后学习阶段毕业设计阶段给自己的指导,从最初的论文选题,到资料的收集,到制定研究计划,到写作、修改,最后到论文定稿,他都给了我耐心的指导和无私的帮助。为了指导我的毕业论文,他放弃了周末的休息时间。同时,

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!