




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、重庆交通大学信息科学与工程学院 课程设计实验报告 专业: 学号: 姓名: 实验室 (中心): 信息技术软件实验室 指导教师: 实验完成时间: 2015 年 1 月 12 日 目录 一、实验设计题目 2 二、实验目的 2 三、实验设计要求 2 四、课程设计条件 2 五、实验设计分析 4 六、实验设计流程图 9 七、结果分析 13 八、实验心得体会 14 九、实验主要代码 15 一、实验设计题目 基于 TCP的服务器 /客户端程序设计 二、实验目的 1、理解客户端与服务器模型的工作原理。 2、掌握套接字的概念。 3、掌握 TCP协议,基于 TCP协议来设计此客户端 / 服务器程序。 4、通过设计面
2、向连接的数据流传输服务程序,加深对面向连接的服务程序 工作流程和基本框架的理解。 三、实验设计要求 1)任选一种编程语言,编程实现面向连接的客户 / 服务器程序,客户端、服 务器端分别编程; 2) 编程要充分体现服务器端与客户端的连接建立、 数据传输、 连接释放的 过程; 四、课程设计条件 本次课程设计我采用的是 JAVA语言,实现客户端和服务器之间的联系。 Java 编程语言的风格十分接近 C、C+语言。 Java 是一个纯的面向对象的 程序设计语言,它继承了 C+语言面向对象技术的核心。 Java 舍弃了 C +语言 中容易引起错误的指针(以引用取代) 、运算符重载( operator o
3、verloading )、 多重继承(以接口取代) 等特性, 增加了垃圾回收器功能用于回收不再被引用的 对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版 本中, Java 又引入了泛型编程( Generic Programming )、类型安全的枚举、不 定长参数和自动装 / 拆箱等语言特性。 Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将 源代码编译成二进制字节码( bytecode ),然后依赖各种不同平台上的虚拟机来 解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。不过,每 次的执行编译后的字节码需要消耗一定的时间,这
4、同时也在一定程度上降低了 Java 程序的运行效率。 Java 语言的变量声明,操作符形式,参数传递,流程控制等方面和 C语言, C+语言完全相同 . 尽管如此, Java 和 C 语言, C+语言又有许多差别,主要表现 在如下几个方面: Java 中对内存的分配是动态的,它采用面向对象的机制,采用运算符 new 为每个对象分配内存空间, 而且, 实际内存还会随程序运行情况而改变。 程序运 行中 Java 系统自动对内存进行扫描, 对长期不用的空间作为” 垃圾”进行收集, 使得系统资源得到更充分地利用 . 按照这种机制,程序员不必关注内存管理问题, 这使 Java 程序的编写变得简单明了,并且
5、避免了由于内存管理方面的差错而导 致系统出问题。而 C 语言通过 malloc ()和 free ()这两个库函数来分别实现 分配内存和释放内存空间的, C+语言中则通过运算符 new和 delete 来分配和释 放内存。在 C 和 C+这种机制中,程序员必须非常仔细地处理内存的使用问题。 一方面,如果对己释放的内存再作释放或者对未曾分配的内存作释放, 都会造成 死机;而另一方面, 如果对长期不用的或不再使用的内存不释放, 则会浪费系统 资源,甚至因此造成资源枯竭。 Java 不在所有类之外定义全局变量, 而是在某个类中定义一种公用静态的 变量来完成全局变量的功能。 Java 不用 goto
6、语句,而是用 try-catch-finally 异常处理语句来代替 goto 语句处理出错的功能。 Java 不支持头文件,而 C 和 C+语言中都用头文件来定义类的原型,全局 变量,库函数等,这种采用头文件的结构使得系统的运行维护相当繁杂。 Java 不支持宏定义,而是使用关键字 final 来定义常量,在 C+中则采用 宏定义来实现常量定义,这不利于程序的可读性。 Java 对每种数据类型都分配固定长度。 比如,在 Java 中, int 类型总是 32 位的,而在 C 和 C+中,对于不同的平台,同一个数据类型分配不同的字节数, 同样是 int 类型,在 PC机中为二字节即 16位,而
7、在 VAX-11中,则为 32位. 这使 得 C 语言造成不可移植性,而 Java 则具有跨平台性(平台无关性) 。 Java 语言编写的类库可以在其它平台的 Java 应用程序中使用,而不像 C+语言 必须依赖于 Windows平台。 五、实验设计分析 本实验的设计是基于 TCP/IP 协议的程序时,传输层使用 TCP协议,它的最 大特点是在通信之前要在客户和服务器之间先建立连接, 在数据传输完成后要关 闭连接,释放网络资源。 对于 TCP协议,主要有以下特点: (1)TCP是面向连接的运输层协议。 应用程序在使用 TCP协议之前, 必须先 建立 TCP连接。在传送数据完毕后,必须释放已经建
8、立的 TCP连接。也就是说, 应用进程之间的通信好像在“打电话” :通话前要先拨号建立连接,通话结束后 要挂机释放连接。 (2)每一条 TCP连接只能有两个端点,每一条 TCP连接只能是点对点的, 即一对一的连接。 (3)TCP提供可靠交付的服务。 通过 TCP连接传送的数据, 无差错、不丢失、 不重复,并且按序到达。 (4)TCP提供全双工通信。 TCP允许通信双方的应用进程在任何时候都能发 送数据。 TCP连接的两端都设有发送缓存和接受缓存,用来临时存放双向通信的 数据。在发送时,应用程序在把数据传送到 TCP的缓存后,就可以做自己的事, 而 TCP在合适的时候把数据发送出去。在接收时,
9、TCP把收到的数据放入缓存, 上层的应用进程在合适的时候读取缓存中的数据。 (5)面向字节流。 TCP中的“流” 指的是流入到进程或从进程流出的字节序 列。虽然应用程序和 TCP的交互是一次一个数据块, 但 TCP把应用程序交下来的 数据看成仅仅是一连串的无结构的字节流。 TCP不保证接收方应用程序所收到的 数据块和发送方应用程序所发出的数据块具有对应大小的关系。 但接收方应用程 序收到的字节流必须和发送方应用程序发出的字节流完全一样。 TCP连接是一条 虚连接而不是一条真正的物理连接。 TCP报文段先要传送到 IP 层,加上 IP 首部 后,再传送到数据链路层。 再加上数据链路层的首部和尾部
10、后, 才离开主机发送 到物理链路。 每一条 TCP连接有两个端点,这个端点就是套接字( socket ),端口号拼接 到 IP 地址即构成了套接字,每一条 TCP连接唯一地被通信两端的两个端点,即 两个套接字所确定。同一个 IP 地址可以有多个不同的 TCP连接,而同一个端口 号也可以出现在不同的 TCP连接中。 TCP是面向连接的协议。运输连接是用来传送 TCP报文的。 TCP运输连接的 建立和释放是每一次面向连接的通信中必不可少的进程。 因此,运输连接就有三 个阶段,即:连接建立、数据传送和连接释放。运输连接的管理就是使运输连接 的建立和释放都能正常的进行。 在 TCP连接建立过程中要解决
11、一下三个问题: (1)要使每一方能够确知对方的存在。 (2)要允许双方协商一些参数(如最大窗口值、是否使用窗口扩大选项和 时间戳选项及服务质量等) 。 (3)能够对运输实体资源(如缓存大小、连接表中的项目等)进行分配。 TCP 连接的建立采用客户服务器方式。主动发起连接建立的应用进程叫做 客户,而被动等待连接建立的应用进程叫做服务器。 下图是 TCP连接建立的过程。 主机 A 运行的是 TCP客户程序,而 B 运行 TCP服务器程序。最初两端的 TCP进程都处于 CLOSED状态。 A 是主动打开连接,而 B 是被动打开连接。 B的 TCP服务器进程先创建传输控制块 TCB,准备接受客户进程的
12、连接请 求。然后服务器进程就处于 LISTEN 状态,等待客户的连接请求。如有,即做出 响应。 A 的 TCP 客户进程也是首先创建传输控制模块 TCB ,然后向 B 发出连接请 求报文段,这时首部中的同步位 SYN=1 ,同时选择一个初始序号 seq=x。SYN 报文段不能携带数据, 但要消耗掉一个序号。这时,TCP客户进程进入 SYN-SENT 状态。 B 收到连接请求报文段后,如同意建立连接,则向 A 发送确认。在确认报 文段中应把 SYN 位和 ACK 位都置 1,确认号是 ack=x+1,同时也为自己选择一 个初始序号 seq=y。这个报文段也不能携带数据,但同样要消耗掉一个序号。这
13、 时 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发出连接释
14、放报文段,并停止再发送数据,主 动关闭 TCP连接。A把连接释放报文段首部的终止控制位 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 连接处于半
15、关闭状态,即 A 已经 没有数据要发送了,但 B若发送数据, A仍要接收。也就是说,从 B到A这个 方向的连接并为关闭,这个状态可能会持续一些时间。 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 置
16、1,确认号 ack=w+1,而自己的序号是 seq=u+1。然后进入到 TIME-WAIT 状态。要经过 4分钟才能进入到 CLOSED 状态,才能开始建立下一个新的连接, 当 A 撤销相应的传输控制块 TCB 后,就结束了这次的 TCP 连接。这个过程就是 TCP 连接释放过程的四次握手。 TCP 的连接释放采用四次握手机制。 任何一方都可以在数据传送结束后发出 连接释放的通知, 待对方确认后就进入半关闭状态。 当另一方也没有数据再发送 被 动 7 TCP 虽然是面向字节流的,但 TCP传送的数据单元却是报文段。一个 TCP 报文段分为首部和数据两部分, 而 TCP的全部功能都体现在它的首部
17、中各字段的 作用。因此,只有弄清 TCP首部各字段的作用才能掌握 TCP的工作原理。 TCP 报文段首部的前 20 个字节是固定的,后面有 4n 字节是根据需要而增 加的选项。因此 TCP首部的最小长度是 20 字节。如下图所示。 对于 TCP报文段中的序号部分,它是占了 4 字节, TCP是面向字节流的,在 下一个 TCP连接中传送的字节流中的每一个字节都按顺序编号, 整个要传送的字 节流的起始序号必须在连接建立时设置。 首部中的序号字段值则指的是本报文段 所发送的数据的第一个字节的序号。例如,一报文段的序号字段值是301,而携 带的数据共有 100 字节。这就表明:本报文段的数据的第一个字
18、节的序号是 301, 最后一个字节的序号是 400。显然,下一个报文段的数据序号应该从 401 开始。 对于确认号,是占 4 个字节,是期望收到对方下一个报文段的第一个数据字 节的序号。 例如,B正确收到了 A发送过来的一个报文段, 其序号字段值是 501, 而数据长度是 200 字节,这表明 B正确收到了 A发送的到序号 700为止的数据。 因此, B期望收到 A的下一个数据序号是 701,于是 B在发送给 A的确认报文段 中把确认号置为 701。 还有一个比较重要的部分就是校验和。是占 2 个字节,校验和字段检验的范 围包括首部和数据这两部分。在计算校验和时,要在 TCP报文段的前面加上
19、12 字节的伪首部。 伪首部的格式与 UDP用户数据报的伪首部一样。 但应把伪首部第 4 个字段中的 17 改为 6,把第 5 字段中的 UDP长度改为 TCP长度,接收方收到此 报文段后,仍要加上这个伪首部来计算校验和。 TCP可靠传输的实现是已字节为单位的滑动窗口。 发送窗口是根据接收窗口 设置的, 但在同一时刻, 发送窗口并不总是和接受窗口一样大。 这是因为通过网 络传送窗口值需要经历一定的时间滞后。 发送方还可以根据网络当时的拥塞情况 适当的减小自己的发送窗口值。 对不按序到达的数据是先临时存放在接受窗口中, 等到字节流中所缺少的字 节收到后,再按序交付上层的应用进程。 TCP要求接收
20、方必须有累积确认的功能,这样可以减少传输开销。接收方可 以在合适的时候发送确认,也可以在自己有数据要发送时把确认信息顺便捎带 上。但是,接收方也不应该过分推迟发送确认, 否则会导致发送方不必要的重传, 这回浪费网络的资源。 其次,捎带确认实际上并不经常发生, 因为大多数应用程 序不同时在两个方向上发送数据。 六、实验设计流程图 本课程设计采用的是 JAVA语言编制的,在 JAVA中,客户端和服务器之间的 通信编程一般是基于 socket 实现的。 Socket 是两个实体之间进行通信的有效端 点,通过 socket 可以获得源 IP 地址和源端口、终点 IP 地址和终点端口,并创 建一个能被多
21、人使用的分布式应用程序,实现与服务器的双向自由通信。 本设计是一对多的 socket 通信,即一个服务器对应多个客户端,采用的方 法是将 socket 对象放置在线程中, 这样当每一个 socket 对象执行完任务后, 只 有包含该 socket 对象的线程会终止,对其他线程没有任何影响。 服务器:服务器是用来接收客户端的各种信息的, 并把信息传送回给客户端。 网络应用程序一般是以客户机 / 服务器的模型的方式工作的。因特网是客户机 / 服务器模型的一个典型应用。 在这种工作方式中, 一个服务器程序通常事先启动, 并在一个熟知端口侦听对服务器的请求。 当客户机应用程序需要某种服务时, 需 向提
22、供这种服务的服务器发出请求, 服务器在接收到请求后, 向客户机发出相应 请求信息。这样客户机应用程序和服务器程序之间便建立了通 进行数据通信。通信任务完成后需要关闭它们之间的通信连接 10 客户端: 开始 将输入数据流读入到缓存中 写到 socket 中 写到 socket 中,清空缓存区,立即发送,从 socket 中读数据 11 服务器线程:相当于服务器里面的 socket 的一个集合,执行一次,就运行一个 socket对象,当每一个 socket对象执行完任务后, 只有包含该 socket 对象的线程 会终止,对其他线程没有任何影响。 12 七、结果分析 首先,运行的是服务器的主程序,由
23、显示可知,服务器已处于等待连接状态。 然后运行的是客户端的程序代码。 可知,服务器与客户端已建立了连接。 此连接 的建立是通过服务器和客户端都有一个端口号一样的 socket,这样才可以建立连 13 接 连接建立以后, 就要开始进行数据传输了, 通过客户端输入要传送的数据, 此数 据通过客户端和服务器之间建立的连接进入到服务器。 在服务器中又调用线程的 程序,来进行数据的出来, 本设计是对数据进行求平方, 并把结果返回给客户端。 在客户端输入 bye 之后,便删除了所建立的连接。多次运行客户端的程序,即可 实现一对多的通信过程, 一个服务器对应多个客户端, 每次执行完一次, 便终止 此 soc
24、ket 对象,下次执行的时候,再进行另外一个线程。 八、实验心得体会 14 经过不断的修改与查找资料, 终于完成了此次课程设计实验, 虽说这次设计 的实验不是很大型, 但是还是学到了很多东西, 收获颇丰, 不仅学习到了一些新 的知识,回顾了一些以前快要遗忘的知识点,而且是自己的学习目标更加明确, 学习方法更加完善, 也体会到了软件开发的趣味, 更加清楚的认识到了自己在软 件开发及学习上的不足之处。 此次设计的是服务器与客户端之间进行通信, 老师在我们设计之前讲解的很 清晰,使得我们大家操作起来比较娴熟。 让我感觉到了软件编程的趣味性和实用 性,虽说一些技术我们在课堂上也曾学习过, 但是大都停留
25、在理论基础上, 实际 开发很少, 而这次实验给了我们一个很好的边学习边实践的机会, 对我们深入学 习这些技术有很大的帮助, 深刻体会到了这些技术的实用性。 这次课程设计的编 程我采用的是 JAVA的语言,虽说以前没有学习过这门语言, 可是经过两个多星期 的查找资料与询问同学,大致上对于 JAVA的编程方法还是有了一定的理解和认 识。JAVA的功能很强大, 有很多要实现的功能, 只要通过调用一些函数就可以实 现了,确实是很好用的一门语言。 每当自己成功调试一段代码或者通过自己的努 力克服一个技术困难, 都颇有收获感。 这次实验让我们体验了软件的实用性, 发 现自己的不足, 增加了一定的编程经验。
26、 结束了此次实验, 让我发现我对我们专 业有了新的认识, 通过这次实验, 我了解到, 要真真正正掌握到计算机程序不是 一件简单的事情, 但真正掌握后, 它带给我们的将是无穷的便捷与科技, 我会努 力学习计算机的! 九、实验主要代码 【服务器线程程序】 package .cqjtu.socket2; import java.io.*; import .*; public class ServerThread extends Thread private Socket s; private DataInputStream is ; / 输入数据流 private DataOutputS
27、tream os; / 输出数据流 / 在构造方法中为每个套接字连接输入和输出流 public ServerThread(Socket socket)throws IOException super (); 15 s=socket; is =new DataInputStream( s .getInputStream(); os=new DataOutputStream( s .getOutputStream(); start(); / 启动 run ()方法 / 在run ()方法中与客户端通信 public void run() try String str; double result,
28、zhi; boolean NotEnd= true ; while (NotEnd) str= is .readUTF(); / 读数据 if (!str.equals( bye ) zhi=Double. parseDouble (str); System. out .println( 接收到的值为: +zhi); result=zhi*zhi; str=Double. toString (result); os .writeUTF(str);/ 写入数据 os.flush(); / 清空缓存 System. out .println( 平方值 +str+ 已经发送 ); else NotE
29、nd= false ; os.writeUTF( bye ); os .flush(); is .close(); os .close(); s .close(); catch (IOException e) e.printStackTrace(); 【服务器主程序 】 package .cqjtu.socket2; import java.io.*; import .*; public class MultiServer public static void main(Stringargs) 16 try System. out .println( 等待连接 ); ServerSocket serverSocket=new ServerSocket(5500); Socket s= nu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《黑豆营养在儿童生长发育中的独特价值》论文
- 2025年注册会计师考试《会计》全真模拟实战试题详解版
- 2025二手房屋买卖合同买方版完整
- 2025全新版铝材购销合同
- 国内草席行业发展现状
- 2025二手购房合同协议书(正式版)
- 2025-2030网络购物平台行业市场深度调研及趋势前景与投融资研究报告
- 2025建筑工程施工合同(合同范本)
- 2025-2030纸加工机械行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030粘土市场行业市场现状供需分析及投资评估规划分析研究报告
- (完整版)《计算机控制系统》课后题答案-刘建昌等科学出版社
- 儿童保健规范化门诊标准(2021年版)
- 金融服务与管理专业群建设方案
- 供配电系统毕业设计
- 《艺术学概论考研》课件艺概绪论
- 中职一年级数学课外活动趣味数学基础知识竞赛课件(必答+选答+风险题含倒计时PPT)
- 班级共读《一年级大个子二年级小个子 》班级读书会(课堂PPT)
- 启闭机房脚手架工程施工专项方案
- 防毒面具使用说明
- 工艺评审记录表
- 浦东改革开放30周年(课堂PPT)
评论
0/150
提交评论