完整word版基于TCP的服务器客户端程序设计Word文件下载.docx
- 文档编号:15760727
- 上传时间:2022-11-15
- 格式:DOCX
- 页数:16
- 大小:314.80KB
完整word版基于TCP的服务器客户端程序设计Word文件下载.docx
《完整word版基于TCP的服务器客户端程序设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《完整word版基于TCP的服务器客户端程序设计Word文件下载.docx(16页珍藏版)》请在冰豆网上搜索。
1、实验设计题目---------------------------------------------------------------------2
2、实验目的---------------------------------------------------------------------------2
3、实验设计要求---------------------------------------------------------------------2
4、课程设计条件---------------------------------------------------------------------2
五、实验设计分析---------------------------------------------------------------------4
六、实验设计流程图------------------------------------------------------------------9
七、结果分析---------------------------------------------------------------------------13
八、实验心得体会---------------------------------------------------------------------14
九、实验主要代码---------------------------------------------------------------------15
1、实验设计题目
基于TCP的服务器/客户端程序设计
2、实验目的
1、理解客户端与服务器模型的工作原理。
2、掌握套接字的概念。
3、掌握TCP协议,基于TCP协议来设计此客户端/服务器程序。
4、通过设计面向连接的数据流传输服务程序,加深对面向连接的服务程序工作流程和基本框架的理解。
3、实验设计要求
1)任选一种编程语言,编程实现面向连接的客户/服务器程序,客户端、服务器端分别编程;
2)编程要充分体现服务器端与客户端的连接建立、数据传输、连接释放的过程;
四、课程设计条件
本次课程设计我采用的是JAVA语言,实现客户端和服务器之间的联系。
Java编程语言的风格十分接近C、C++语言。
Java是一个纯的面向对象的程序设计语言,它继承了C++语言面向对象技术的核心。
Java舍弃了C++语言中容易引起错误的指针(以引用取代)、运算符重载(operatoroverloading)、多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。
在Java1.5版本中,Java又引入了泛型编程(GenericProgramming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
Java不同于一般的编译执行计算机语言和解释执行计算机语言。
它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。
从而实现了“一次编译、到处执行”的跨平台特性。
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了Java程序的运行效率。
Java语言的变量声明,操作符形式,参数传递,流程控制等方面和C语言,C++语言完全相同.尽管如此,Java和C语言,C++语言又有许多差别,主要表现在如下几个方面:
Java中对内存的分配是动态的,它采用面向对象的机制,采用运算符new为每个对象分配内存空间,而且,实际内存还会随程序运行情况而改变。
程序运行中Java系统自动对内存进行扫描,对长期不用的空间作为”垃圾”进行收集,使得系统资源得到更充分地利用.按照这种机制,程序员不必关注内存管理问题,这使Java程序的编写变得简单明了,并且避免了由于内存管理方面的差错而导致系统出问题。
而C语言通过malloc()和free()这两个库函数来分别实现分配内存和释放内存空间的,C++语言中则通过运算符new和delete来分配和释放内存。
在C和C++这种机制中,程序员必须非常仔细地处理内存的使用问题。
一方面,如果对己释放的内存再作释放或者对未曾分配的内存作释放,都会造成死机;
而另一方面,如果对长期不用的或不再使用的内存不释放,则会浪费系统资源,甚至因此造成资源枯竭。
Java不在所有类之外定义全局变量,而是在某个类中定义一种公用静态的变量来完成全局变量的功能。
Java不用goto语句,而是用try-catch-finally异常处理语句来代替goto语句处理出错的功能。
Java不支持头文件,而C和C++语言中都用头文件来定义类的原型,全局变量,库函数等,这种采用头文件的结构使得系统的运行维护相当繁杂。
Java不支持宏定义,而是使用关键字final来定义常量,在C++中则采用宏定义来实现常量定义,这不利于程序的可读性。
Java对每种数据类型都分配固定长度。
比如,在Java中,int类型总是32位的,而在C和C++中,对于不同的平台,同一个数据类型分配不同的字节数,同样是int类型,在PC机中为二字节即16位,而在VAX-11中,则为32位.这使得C语言造成不可移植性,而Java则具有跨平台性(平台无关性)。
Java语言编写的类库可以在其它平台的Java应用程序中使用,而不像C++语言必须依赖于Windows平台。
五、实验设计分析
本实验的设计是基于TCP/IP协议的程序时,传输层使用TCP协议,它的最大特点是在通信之前要在客户和服务器之间先建立连接,在数据传输完成后要关闭连接,释放网络资源。
对于TCP协议,主要有以下特点:
(1)TCP是面向连接的运输层协议。
应用程序在使用TCP协议之前,必须先建立TCP连接。
在传送数据完毕后,必须释放已经建立的TCP连接。
也就是说,应用进程之间的通信好像在“打电话”:
通话前要先拨号建立连接,通话结束后要挂机释放连接。
(2)每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的,即一对一的连接。
(3)TCP提供可靠交付的服务。
通过TCP连接传送的数据,无差错、不丢失、不重复,并且按序到达。
(4)TCP提供全双工通信。
TCP允许通信双方的应用进程在任何时候都能发送数据。
TCP连接的两端都设有发送缓存和接受缓存,用来临时存放双向通信的数据。
在发送时,应用程序在把数据传送到TCP的缓存后,就可以做自己的事,而TCP在合适的时候把数据发送出去。
在接收时,TCP把收到的数据放入缓存,上层的应用进程在合适的时候读取缓存中的数据。
(5)面向字节流。
TCP中的“流”指的是流入到进程或从进程流出的字节序列。
虽然应用程序和TCP的交互是一次一个数据块,但TCP把应用程序交下来的数据看成仅仅是一连串的无结构的字节流。
TCP不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块具有对应大小的关系。
但接收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样。
TCP连接是一条虚连接而不是一条真正的物理连接。
TCP报文段先要传送到IP层,加上IP首部后,再传送到数据链路层。
再加上数据链路层的首部和尾部后,才离开主机发送到物理链路。
每一条TCP连接有两个端点,这个端点就是套接字(socket),端口号拼接到IP地址即构成了套接字,每一条TCP连接唯一地被通信两端的两个端点,即两个套接字所确定。
同一个IP地址可以有多个不同的TCP连接,而同一个端口号也可以出现在不同的TCP连接中。
TCP是面向连接的协议。
运输连接是用来传送TCP报文的。
TCP运输连接的建立和释放是每一次面向连接的通信中必不可少的进程。
因此,运输连接就有三个阶段,即:
连接建立、数据传送和连接释放。
运输连接的管理就是使运输连接的建立和释放都能正常的进行。
在TCP连接建立过程中要解决一下三个问题:
(1)要使每一方能够确知对方的存在。
(2)要允许双方协商一些参数(如最大窗口值、是否使用窗口扩大选项和时间戳选项及服务质量等)。
(3)能够对运输实体资源(如缓存大小、连接表中的项目等)进行分配。
TCP连接的建立采用客户服务器方式。
主动发起连接建立的应用进程叫做客户,而被动等待连接建立的应用进程叫做服务器。
下图是TCP连接建立的过程。
主机A运行的是TCP客户程序,而B运行TCP服务器程序。
最初两端的TCP进程都处于CLOSED状态。
A是主动打开连接,而B是被动打开连接。
B的TCP服务器进程先创建传输控制块TCB,准备接受客户进程的连接请求。
然后服务器进程就处于LISTEN状态,等待客户的连接请求。
如有,即做出响应。
A的TCP客户进程也是首先创建传输控制模块TCB,然后向B发出连接请求报文段,这时首部中的同步位SYN=1,同时选择一个初始序号seq=x。
SYN报文段不能携带数据,但要消耗掉一个序号。
这时,TCP客户进程进入SYN-SENT状态。
B收到连接请求报文段后,如同意建立连接,则向A发送确认。
在确认报文段中应把SYN位和ACK位都置1,确认号是ack=x+1,同时也为自己选择一个初始序号seq=y。
这个报文段也不能携带数据,但同样要消耗掉一个序号。
这时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把连接释放报文段首部的终止控制位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这个方向的连接并为关闭,这个状态可能会持续一些时间。
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后,就结束了这次的TCP连接。
这个过程就是
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 完整 word 基于 TCP 服务器 客户端 程序设计