




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、重庆交通大学信息科学与工程学院课程设计实验报告口,号:名:实验室(中心):信息技术软件实验室指导教师:实验完成时间:2015年J月_J2一、实验设计题目二、实验目的三、实验设计要求四、课程设计条件五、实验设计分析六、实验设计流程图七、结果分析八、实验心得体会九、实验主要代码目录13141519、实验设计题目基于TCP的服务器/客户端程序设计二、实验目的1、理解客户端与服务器模型的工作原理。2、掌握套接字的概念。3、掌握TCP协议,基于TCP协议来设计此客户端/服务器程序。4、通过设计面向连接的数据流传输服务程序,加深对面向连接的服务程序工作流程和基本框架的理解。三、实验设计要求1)任选一种编程
2、语言,编程实现面向连接的客户/服务器程序,客户端、服务器端分别编程;2)编程要充分体现服务器端与客户端的连接建立、数据传输、连接释放的过程;四、课程设计条件本次课程设计我采用的是JAVA语言,实现客户端和服务器之间的联系。Java编程语言的风格十分接近 C C+H语言。Java是一个纯的面向对象的程序设计语言,它继承了 C+语言面向对象技术的核心。Java舍弃了 C +语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)、 多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在J
3、ava 1.5版本中,Java又引入了泛型编程(Gen eric P rogrammi ng )、类型安全的枚举、不 定长参数和自动装/拆箱等语言特性。Java不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode ),然后依赖各种不同平台上的虚拟机来 解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。不过,每 次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了Java程序的运行效率。Java语言的变量声明,操作符形式,参数传递,流程控制等方面和C语言,C+语言完全相同.尽管如此,Java和C语言,C+语言又有许多差
4、别,主要表现在如下几个方面:Java中对内存的分配是动态的,它采用面向对象的机制,采用运算符new为每个对象分配内存空间,而且,实际内存还会随程序运行情况而改变。 程序运 行中Java系统自动对内存进行扫描,对长期不用的空间作为”垃圾”进行收集, 使得系统资源得到更充分地利用.按照这种机制,程序员不必关注内存管理问题, 这使Java程序的编写变得简单明了,并且避免了由于内存管理方面的差错而导 致系统出问题。而C语言通过malloc ()和free ()这两个库函数来分别实现 分配内存和释放内存空间的,C+语言中则通过运算符new和delete来分配和释 放内存。在C和C+这种机制中,程序员必须
5、非常仔细地处理内存的使用问题。一方面,如果对己释放的内存再作释放或者对未曾分配的内存作释放,都会造成 死机;而另一方面,如果对长期不用的或不再使用的内存不释放, 则会浪费系统 资源,甚至因此造成资源枯竭。Java 不在所有类之外定义全局变量,而是在某个类中定义一种公用静态的 变量来完成全局变量的功能。Java 不用goto语句,而是用try-catch-finally异常处理语句来代替 goto语句处理出错的功能。Java 不支持头文件,而C和C+语言中都用头文件来定义类的原型,全局 变量,库函数等,这种采用头文件的结构使得系统的运行维护相当繁杂。Java不支持宏定义,而是使用关键字final
6、来定义常量,在C+中则采用 宏定义来实现常量定义,这不利于程序的可读性。Java 对每种数据类型都分配固定长度。 比如,在Java中,int类型总是32 位的,而在C和C+中,对于不同的平台,同一个数据类型分配不同的字节数, 同样是int类型,在PC机中为二字节即16位,而在VAX-1仲,则为32位.这使 得C语言造成不可移植性,而Java则具有跨平台性(平台无关性)。Java语言编写的类库可以在其它平台的 Java应用程序中使用,而不像 C+语言必须依赖于Windows平台。五、实验设计分析本实验的设计是基于TCP/IP协议的程序时,传输层使用TCP协议,它的最 大特点是在通信之前要在客户和
7、服务器之间先建立连接,在数据传输完成后要关 闭连接,释放网络资源。对于TCP协议,主要有以下特点:(1) TCP是面向连接的运输层协议。应用程序在使用TCP协议之前,必须先建立TCP连接。在传送数据完毕后,必须释放已经建立的 TCP连接。也就是说,应用进程之间的通信好像在“打电话”:通话前要先拨号建立连接,通话结束后 要挂机释放连接。(2) 每一条TCP连接只能有两个端点,每一条 TCP连接只能是点对点的,即一对一的连接。TCP提供可靠交付的服务。通过TCP连接传送的数据,无差错、不丢失、不重复,并且按序到达。(4) TCP提供全双工通信。TCP允许通信双方的应用进程在任何时候都能发送数据。T
8、CP连接的两端都设有发送缓存和接受缓存,用来临时存放双向通信的 数据。在发送时,应用程序在把数据传送到 TCP的缓存后,就可以做自己的事,而TCP在合适的时候把数据发送出去。在接收时, TCP把收到的数据放入缓存,上层的应用进程在合适的时候读取缓存中的数据。(5)面向字节流。TCP中的“流”指的是流入到进程或从进程流出的字节序列。虽然应用程序和TCP的交互是一次一个数据块,但TCP把应用程序交下来的数据看成仅仅是一连串的无结构的字节流。TCP不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块具有对应大小的关系。但接收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样。
9、TCP连接是一条虚连接而不是一条真正的物理连接。TCP报文段先要传送到IP层,加上IP首部后,再传送到数据链路层。再加上数据链路层的首部和尾部后,才离开主机发送到物理链路。每一条TCP连接有两个端点,这个端点就是套接字(socket),端口号拼接 到IP地址即构成了套接字,每一条 TCP连接唯一地被通信两端的两个端点,即两个套接字所确定。同一个IP地址可以有多个不同的TCP连接,而同一个端口 号也可以出现在不同的TCP连接中。TCP是面向连接的协议。运输连接是用来传送 TCP报文的。TCP运输连接的建立和释放是每一次面向连接的通信中必不可少的进程。因此,运输连接就有三 个阶段,即:连接建立、数
10、据传送和连接释放。运输连接的管理就是使运输连接 的建立和释放都能正常的进行。在TCP连接建立过程中要解决一下三个问题:(1)要使每一方能够确知对方的存在。(2)要允许双方协商一些参数(如最大窗口值、是否使用窗口扩大选项和时间戳选项及服务质量等)。(3) 能够对运输实体资源(如缓存大小、连接表中的项目等)进行分配。TCP 连接的建立采用客户服务器方式。主动发起连接建立的应用进程叫做 客户,而被动等待连接建立的应用进程叫做服务器。下图是TCP连接建立的过程。主机A运行的是TCP客户程序,而B运行TCP服务器程序。最初两端的TCP进程都处于CLOSED状态。A是主动打开连接,而B是被动打开连接。B的
11、TCP服务器进程先创建传输控制块 TCB,准备接受客户进程的连接请求。然后服务器进程就处于LISTEN状态,等待客户的连接请求。如有,即做出 响应。A的TCP客户进程也是首先创建传输控制模块 TCB,然后向B发出连接请seq=x。SYN求报文段,这时首部中的同步位 SYN=1,同时选择一个初始序号报文段不能携带数据,但要消耗掉一个序号。这时,TCP客户进程进入SYN-SENT 状态。B收到连接请求报文段后,如同意建立连接,则向A发送确认。在确认报文段中应把SYN位和ACK位都置1,确认号是ack=x+1,同时也为自己选择一 个初始序号seq=y。这个报文段也不能携带数据,但同样要消耗掉一个序号
12、。这 时TCP服务器进程进入SYN-RCVD状态。TCP客户进程收到B的确认后,还要向B给出确认。确认报文段的ACK置 1,确认号ack=y+1,而自己的序号seq=x+1,ACK报文段可以携带数据,但如果不携带数据则不消耗序号,在这种情况下,下一个数据报文段的序号仍是seq=x+1。这时,TCP连接已经建立,A进入ESTABLISHED状态。当B收到A确认后,也进入ESTABLISHED状态,这个过程就是三次握手。数据传输结束后,通信双方都可释放连接。现在A和B都处ESTABLISHED 状态。A的应用进程先向其TCP发出连接释放报文段,并停止再发送数据,主 动关闭TCP连接。A把连接释放报
13、文段首部的终止控制位 FIN置1,其序号seq=u,它等于前面已传送过的数据的最后的一个字节的序号加1。这时A进入FIN-WAIT-1状态,等待B的确认。FIN报文段即使不携带数据,它也消耗掉一个序号。B收到连接释放报文段后即发出确认,确认号是ack=u+1,而这个报文段自己的序号是V,等于B前面已传送过的数据的最后一个字节的序号加1。然后B就进入CLOSE-WAIT状态。TCP服务器进程这时应停止高层应用进程,因而从A到B这个方向的连接就释放了,这时的 TCP连接处于半关闭状态,即A已经没有数据要发送了,但B若发送数据,A仍要接收。也就是说,从B到A这个 方向的连接并为关闭,这个状态可能会持
14、续一些时间。A收到来自B的确认后,就进入FIN-WAIT-2状态,等待B发出的连接释放报文段。若B已经没有要向A发送的数据,其应用进程就通知 TCP释放连接。这时B发出的连接释放报文段必须使 FIN=1。假定B的序号为w,B还必须重复上次已发送过的确认号ack=u+1。这是B就进入LAST-ACK状态,等待A的确认。A在收到B的连接释放报文段后,必须对此发出确认。在确认报文段中把ACK置1,确认号ack=w+1,而自己的序号是seq=u+1。然后进入到TIME-WAIT状态。要经过4分钟才能进入到CLOSED状态,才能开始建立下一个新的连接, 当A撤销相应的传输控制块TCB后,就结束了这次的T
15、CP连接。这个过程就是TCP连接释放过程的四次握手。TCP的连接释放采用四次握手机制。任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后就进入半关闭状态。当另一方也没有数据再发送时,则发送连接通知,对方确认后就完全关闭了TCP连接。如下图所示。被动TCP 虽然是面向字节流的,但TCP专送的数据单元却是报文段。一个 TCP报文段分为首部和数据两部分,而TCP的全部功能都体现在它的首部中各字段的 作用。因此,只有弄清TCP首部各字段的作用才能掌握TCP的工作原理。TCP 报文段首部的前20个字节是固定的,后面有4n字节是根据需要而增加的选项。因此TCP首部的最小长度是20字节。如下图所
16、示。20字书TCP对于TCP报文段中的序号部分,它是占了 4字节,TCP是面向字节流的,在下一个TCP连接中传送的字节流中的每一个字节都按顺序编号,整个要传送的字 节流的起始序号必须在连接建立时设置。首部中的序号字段值则指的是本报文段所发送的数据的第一个字节的序号。例如,一报文段的序号字段值是301,而携带的数据共有100字节。这就表明:本报文段的数据的第一个字节的序号是 301,最后一个字节的序号是400。显然,下一个报文段的数据序号应该从401开始。对于确认号,是占4个字节,是期望收到对方下一个报文段的第一个数据字节的序号。例如,B正确收到了 A发送过来的一个报文段,其序号字段值是501,
17、而数据长度是200字节,这表明B正确收到了A发送的到序号700为止的数据。因此,B期望收到A的下一个数据序号是701,于是B在发送给A的确认报文段中把确认号置为701。还有一个比较重要的部分就是校验和。是占2个字节,校验和字段检验的范围包括首部和数据这两部分。在计算校验和时,要在TCP报文段的前面加上12字节的伪首部。伪首部的格式与UDP用户数据报的伪首部一样。但应把伪首部第4个字段中的17改为6,把第5字段中的UDP长度改为TCP长度,接收方收到此报文段后,仍要加上这个伪首部来计算校验和。TCP可靠传输的实现是已字节为单位的滑动窗口。发送窗口是根据接收窗口 设置的,但在同一时刻,发送窗口并不
18、总是和接受窗口一样大。 这是因为通过网 络传送窗口值需要经历一定的时间滞后。 发送方还可以根据网络当时的拥塞情况 适当的减小自己的发送窗口值。对不按序到达的数据是先临时存放在接受窗口中, 等到字节流中所缺少的字 节收到后,再按序交付上层的应用进程。TCP要求接收方必须有累积确认的功能,这样可以减少传输开销。接收方可以在合适的时候发送确认,也可以在自己有数据要发送时把确认信息顺便捎带 上。但是,接收方也不应该过分推迟发送确认,否则会导致发送方不必要的重传, 这回浪费网络的资源。其次,捎带确认实际上并不经常发生,因为大多数应用程 序不同时在两个方向上发送数据。六、实验设计流程图本课程设计采用的是J
19、AVA语言编制的,在JAVA中,客户端和服务器之间的 通信编程一般是基于socket实现的。Socket是两个实体之间进行通信的有效端 点,通过socket可以获得源IP地址和源端口、终点IP地址和终点端口,并创 建一个能被多人使用的分布式应用程序,实现与服务器的双向自由通信。本设计是一对多的socket通信,即一个服务器对应多个客户端,采用的方 法是将socket对象放置在线程中,这样当每一个socket对象执行完任务后,只 有包含该socket对象的线程会终止,对其他线程没有任何影响。服务器:服务器是用来接收客户端的各种信息的, 并把信息传送回给客户端。网络应用程序一般是以客户机/服务器的
20、模型的方式工作的。因特网是客户机/ 服务器模型的一个典型应用。在这种工作方式中,一个服务器程序通常事先启动, 并在一个熟知端口侦听对服务器的请求。当客户机应用程序需要某种服务时,需 向提供这种服务的服务器发出请求, 服务器在接收到请求后,向客户机发出相应请求信息。这样客户机应用程序和服务器程序之间便建立了通信连接此后川以 进行数据通信。通信任务完成后需要关闭它们之间的通信连接。客户端:(开始J设置一个新的socket,定义端口号为 5500,连接到本机将输入数据流连接到socket上将数据输出流连接到socket上打印输入待求平方值,输入bye结束1 将输入数据流读入到缓存中进行一个while
21、死循环读入用户的写入写到socket中写到socket中,清空缓存区,立即发送,从socket中读数据服务器线程:相当于服务器里面的 socket的一个集合,执行一次,就运行一个 socket对象,当每一个socket对象执行完任务后,只有包含该socket对象的线程会终止,对其他线程没有任何影响。七、结果分析口ihlCjpv. I 山 hlLjfcSflVerjm 诂- X/TkinMcLj叭I IS1Pdckage .cqjtu.socket;屮import java io,*;_ public class MuitiServer Jpublic static void mai
22、n(Stringargs”trySystem. out.printin (”等待连接);Serversocket serversocket-new Serversocket(5500); Socket s=null;whilt(true)/等待喜户端的请求s=serversocket.accept();/闵疾请束部等待一经程来址哩new ServerThread(5);-_rIh_-_rR c ate h (lOE X c ept ion e) e printtac乂T race();叵 Pmblgns g血C 底.Pf 山臥血 I Q Conwif 為 为 DebugMuftiSrve/Ja
23、 Applicion D:山曲Ibi旳m曲赋u日(2015-1-12 上牛 11 创汩 1 等待连接 a箕*5B|首先,运行的是服务器的主程序,由显示可知,服务器已处于等待连接状态。H. Ulitnt.jdYB 鈕 UJ MuH*5t*vmj刿a | 凶 託wtfTliiiMdjfv, |package cn,edu,cqjtu.socket?;zinport jsva*io+*;口_ public class Client - public static void iiiain(5tring5rgs)tHl/连接到本机,端号为5500Socket s-rew Socketlocalhost5
24、500);涔針据输A诜连捞到socket!DataInpjtStream is=new DatalnputStremn(s+getInputStredmf);/M 据皤出浦连接到ECitzkEt上Dat a Out put St rea ni o&=inew DataOutput Stream t s. getOu tputSt reamC) jjSystem ”皿匕print In (愉入待隶平方値,fSAbye结束a );string outStrJ inStr;boolean NotErd=true;Buffe r 亡 dReader buf=new Buff er ed Read er
25、 (new IrputSt reafflREader(5yEtem. in); /丿反賈读用户飾數拯幷计算 while(NotEnd)outStr=bLif .neadLineO;读入用户的散据os.writeLlTF(outStr) i/:WAsocket 中H J X-H I? L Prabkms & JavDdo(7| Dclardtion j S Canonic 壮、坟 口耳hug Jav Applkadoo D.VJ斜瞄Binlj的聊cfe (2015442 输入待求平方值,输入byE结束.然后运行的是客户端的程序代码。 可知,服务器与客户端已建立了连接。此连接的建立是通过服务器和客
26、户端都有一个端口号一样的socket,这样才可以建立连接。0 匸li电nlja旳 3 -0 Mui沾出旳乱臼0 Srvr7hfad.jAvdI7/将獭据甯人髓揍到Exk芒t上Dataln pu tStream is=new DataInputStreami(s - get In pu tStreamC);”将数摇输出濱连搂到Exk毗上DataOutputStream os=new DataOutputStreami(s-getOutputStreami();System.otJt.priritln5Ai入待求平方值输入bye结束* ”);String outStrdnStr;boolean h
27、lotEnd=true;BufferedReader bufnew BufferedReader(new InputStresmReader(System*in); /F反境读用户的埶并计耳whileCNotEnd)oiJtStr=buf. readLlne ();读 A.用户的数 ISos H writ ellTF (oLJtStr) ;A socket 中n . _ i_ / _ Jrrran jXi *I: Problunt仗辭曲DmIm竝匸白仙沱密 学血bug WurtiSfirvfrJava Application D;灯航訥birfjtfvaw曲e 2015-1-12 下罕03&弓
28、E) 等待连接接收到的值为:2,0平方值4*0已经发送;MultiStfVt叮T, SarvetlhrCAd.jjvj |LCllU = rrUC iBuffered Read er buf=new Buff en&dReader(new InputStr*eamReaden(System. In) 反豆读用户的数据并计算while(NotEnd)oijtstr=buf. readLine据os .wniteUTFoutStP); /:Asocket 中$Mlu汕()7活空强存区立即发送5厂十厂一T c rd-rlllllT 匚 f f LJ. c-thh- La 十口3;菲州坦.? PtDb
29、lcfns 问 Jd.ddcc 曉 DKldrtiDn Q 匚口&口1 匕血bugClicrvt 的9 Applkabon DiUavabinXjjvaw-ise J015442 玉工2:43:4 输入待求平方值,输入bye结束.9返回结果:81.0S返回结果:G4.08返回结果:64,0bye连接建立以后,就要开始进行数据传输了,通过客户端输入要传送的数据,此数 据通过客户端和服务器之间建立的连接进入到服务器。 在服务器中又调用线程的 程序,来进行数据的出来,本设计是对数据进行求平方,并把结果返回给客户端。在客户端输入bye之后,便删除了所建立的连接。多次运行客户端的程序,即可 实现一对多的
30、通信过程,一个服务器对应多个客户端,每次执行完一次,便终止 此socket对象,下次执行的时候,再进行另外一个线程。八、实验心得体会经过不断的修改与查找资料,终于完成了此次课程设计实验,虽说这次设计 的实验不是很大型,但是还是学到了很多东西,收获颇丰,不仅学习到了一些新 的知识,回顾了一些以前快要遗忘的知识点,而且是自己的学习目标更加明确, 学习方法更加完善,也体会到了软件开发的趣味,更加清楚的认识到了自己在软 件开发及学习上的不足之处。此次设计的是服务器与客户端之间进行通信, 老师在我们设计之前讲解的很 清晰,使得我们大家操作起来比较娴熟。让我感觉到了软件编程的趣味性和实用 性,虽说一些技术
31、我们在课堂上也曾学习过, 但是大都停留在理论基础上,实际 开发很少,而这次实验给了我们一个很好的边学习边实践的机会,对我们深入学 习这些技术有很大的帮助,深刻体会到了这些技术的实用性。这次课程设计的编 程我采用的是JAVA勺语言,虽说以前没有学习过这门语言,可是经过两个多星期 的查找资料与询问同学,大致上对于JAVA勺编程方法还是有了一定的理解和认 识。JAVA勺功能很强大,有很多要实现的功能,只要通过调用一些函数就可以实 现了,确实是很好用的一门语言。每当自己成功调试一段代码或者通过自己的努 力克服一个技术困难,都颇有收获感。这次实验让我们体验了软件的实用性,发现自己的不足,增加了一定的编程
32、经验。结束了此次实验,让我发现我对我们专业有了新的认识,通过这次实验,我了解到,要真真正正掌握到计算机程序不是一件简单的事情,但真正掌握后,它带给我们的将是无穷的便捷与科技, 我会努力学习计算机的!九、实验主要代码【服务器线程程序】Package .cqjtu.socket2; import java.io.*;importjava .n et.*;publicclass ServerThreadp rivateSocket s;p rivateData Inpu tStreamp rivateDataOut pu tStreamextends Threadis ; /输入数据流
33、os; /输出数据流/在构造方法中为每个套接字连接输入和输出流Public ServerThread(Socket socket)throws IOExceptionsuper ();s=socket;is =new DataI np utStream(s.getI np utStream();os=new DataOut putStream(s .getOut putStream();start();/ 启动run ()方法/在run ()方法中与客户端通信public void run()try Stri ng str;double result,zhi;boolean NotEnd= t
34、rue ;while (NotEnd)str= is .readUTFO;/ 读数据接收到的值为:+zhi);(result); 写入数据if (!str.equals( bye ) zhi=Double. parseDouble (str); System. out .println( result=zhi*zhi;str=Double. toStri ng os.writeUTF(str); / os.flush(); / 清空缓存System. out .println( 平方值+st叶已经发送); else NotEnd= false ;os.writeUTF( bye); os.flush();is .close();os.closeO; s.close(); catch (lOException e)e. prin tStackTrace(); 【服务器主程序】
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 住宅小区场地租赁及消防安全协议
- 融资租赁厂房股权转让协议书样本
- 商业写字楼场地租赁及物业管理服务合同
- 餐饮企业拆伙退伙合同(员工安置)
- 智能家居市场拓展场营销策划协议
- 绿色能源产品全国独家代理销售合同样本
- 离婚财产分割中的股票期权行权合同
- 厂房施工与建筑垃圾减量化处理协议
- 高端特色餐饮店租赁合同范本
- 企事业单位多功能厅租赁合同
- 致大海普希金
- 红旗E-HS3汽车说明书
- 2023年工作分析实务形成性考核及答案
- 动态几何画板Geogebra教学应用
- 中石油职称英语考试大纲模拟题答案解析
- 《五步拳》微课程设计方案
- 基于单片机的智能垃圾桶控制系统设计与实现-毕业论文
- 柔性接口镇墩计算
- 脚手架高支模构造要求
- GB/T 5599-2019机车车辆动力学性能评定及试验鉴定规范
- GB/T 40802-2021通用铸造碳钢和低合金钢铸件
评论
0/150
提交评论