Socket实现双机通信
利用Socket实现双机通信
1、设计概述
1.1 TCP/IP协议
TCP/IP协议(传输控制协议/网际协议)是一种网络通信协议,是一种面向连接的可靠的传输协议。它规范了网络上的所有通信设备,尤其是一个主机与另一个主机之间的数据传输格式以及传送方式。TCP/IP是Internet的基础协议。
TCP/IP协议的基本传输单位是数据报(Dataggram)。TCP协议负责把数据分成若干个Datagram,并给每个Datagram加上包头。通常把要发送的整块数据块叫一个报文,就是上面的Datagram,在发送报文之前,先把较长的报文划分为一各个个更小的等长的数据段,并在每个数据段之前加上一些控制信息组成的首部,也就是前面的包头。包头里包含了诸如目的地址和源地址等重要控制信息,这样一个个被划分的分组才能在因特网中独立地选择传输路径。如果传输过程中出现数据丢失或数据失真等异常情况,TCP协议会自动要求数据重发,并重新分组。TCP 协议保证数据传输的质量,IP协议保证数据的传输。
TCP/IP协议数据的传输是基于TCP/IP模型的四层结构:应用层、传输层、网络层和网络接口层。
两个主要的传输层协议:传输控制协议(TCP)和用户数据报协议(UDP)。由于设计是按照TCP/IP协议,有必要介绍下TCP。
TCP传输数据建立在面向连接的基础上,实现了一种“虚电路”的概念。双方通信之前,先建立连接,然后双方即可在其上发送数据,发送完毕后关闭连接。这种数据交换方式的有点是效率高,缺点是建立连接和关闭连接需要额外的开销。
TCP协议主要提供如下服务:
可靠的数据传输
面向连接的虚电路
缓冲的传输
重新排序
多路复用技术
高效的、全双工传输
流量控制
TCP协议提供的是一种可靠的数据流服务。得到的是一个顺序的无差错的数据流。
套接字(Socket)
套接字允许程序员把网络连接当成一个流,并向这个流读写字节。Socket对程序员掩盖了网络的底层细节,如纠错、包大小、包传输、网络地址等。数据在Internet中是以有限大小的分组的形式传输的。一个分组是一个数据报,包括首部和负载。首部包含目的地址和端口、源地址和端口以及用于保证可靠传输的各种其他管理信息。负载包含数据本身。但由于分组长度有限,通常必须将数据分解为多个分组,在目的地重新组合。在传输过程中,有可能发生一个或多个分组丢失或被破坏的情况,此时就需要重新分组。或者分组乱序到达,则需要重新排序。这些工作将是非常繁重。幸好的是套接字的出现是我们不必关心这些琐事,我们只要把网络看成一个流就行了。
套接字(socket)是网络协议传输层提供的接口。Socket是两个程序间进行双向数据传输的网络通信端点,由一个地址和一个端口号来标识,每个服务程序在提供服务时都需要在一个端口进行,而想使用该服务的客户机也必须连接改端口。
目前有两种套接字:流套接字(Stream Socket)和数据报套接字(Datagram Socket)。流套接字提供一个面向连接的、可靠的数据传输服务,保证数据无差错、无重复、按顺序发送,具有流量控制功能,数据被看成字节流,无长度限制。TCP即是一种基于流套接字的通信协议。本设计就是基于TCP/IP协议的Socket编程,在这种情况下,Socket可以看出是两个程序进行通信连接中的一个端点,一个程序将一段信息写入Socket中,该Socket将这段信息发送到另外一个Socket中,使这段信息能传送到其他程序。每个基于TCP/IP的程序都赋予了一个端口号(0~65535),通过不同的端口号,区别服务器上运行的每一个应用程序和所提供的服务。不过一般要用1024以上的端口号,因为1024一下的端口号一般保留给系统服务使用。
1.2 设计目的和要求:
①利用WinSock来实现双机通信,理解TCP状态机图
②要求使用WinSock编程,采用其中的TCP面向连接方式,实现文本数据的交换。
设计方案
本设计用对网络有得天独厚优势的、“一处编写、到处运行”的Java语言作为编程语言,用基于JDK1.6的MyEclipse集成开发环境进行开发。主要用到.Socket类和.ServerSocket类以及java.io包中的类来实现客户服务器端套接字对象的建立、连接、通信、释放连接,其中.Socket类是Java用来实现客户端TCP操作的基础类,在Java编制中,一切与TCP有关的操作都由Socket类负责,这个类本身使用直接代码通过主机操作系统的本地TCP栈进行通信,Socket的输入输出都通过流来实现。ServerSocket类的功能是在客户端通过Socket请求数据通信后,服务器端需要有一个响应客户端请求通信的服务程序,该服务程序将应用ServerSocket类来完成与客户端的通信:S