讲解TCP协议,我们首先要了解什么是网络通讯协议.
1、网络通讯协议
两台计算机要想在网络中互相通讯,就必须要遵守一定的规定,并且只有通讯双方同时遵守了这些规定,才能够实现数据的相互传输.而这些规定,便是由网络通讯协议针对数据传输格式,传输速率,传输步骤等制定的.
2、网络协议分类
java.net 包中包含的类和接口,它们提供低层次的通信细节,其中包含了两种常见的网络协议的支持:
1)TCP(Transmission Control Protocal)
即传输控制协议,TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输.
TCP协议中有个三次握手的概念,即在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠:
- 第一次握手,客户端向服务器端发出连接请求,等待服务器确认.
- 第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求.
- 第三次握手,客户端再次向服务器端发送确认信息,确认连接.
完成三次握手,连接建立后,客户端和服务器就可以开始进行数据传输了。由于这种面向连接的特性,TCP协议可以保证传输数据的安全,所以应用十分广泛,例如下载文件、浏览网页等.
1.1)TCP/IP(Transmission Control Protocol/Internet Protocol)
即传输控制协议/因特网互联协议,它是Internet最基本、最广泛的协议。它定义了计算机如何连入因特网,以及数据如何在它们之间传输的标准。它的内部包含一系列的用于处理数据通信的协议,并采用了4层的分层模型,每一层都呼叫它的下一层所提供的协议来完成自己的需求。
2)UDP(User Datagram Protocal)
即用户数据包协议,UDP协议是一个面向无连接的协议。传输数据时,不需要建立连接,不管对方的服务是否启动,直接将数据、数据源和目的地都封装在数据包中,直接发送。每个数据包的大小限制在64k以内。它是不可靠协议,因为无连接,所以传输速度快,但是容易丢失数据。日常应用中,例如视频会议、QQ聊天等。
3.TCP通讯程序
在Java中,提供了两个类用于实现TCP通信程序:
1). 客户端: java.net.Socket 类表示。创建 Socket 对象,向服务端发出连接请求,服务端响应请求,两者建立连接开始通信。
2). 服务端: java.net.ServerSocket 类表示。创建 ServerSocket 对象,相当于开启一个服务,并等待客户端的连接。
3.1TCP通讯流程分析
1.服务端启动,等待客户端连接
2.客户端发送连接请求,等待服务端确认
3.服务端接收请求,调用accept方法,返回Socket对象
4.客户端通过Socket对象获取输出流,向服务端写入数据
5.服务端通过Socket对象获取输入流,读取客户端写入的数据
6.服务端通过Socket获取输出流,向客户端回写数据
7.客户端通过Socket获取输入流,读取服务端回写的数据
3.2 代码实现
package com.tcp; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; /** * @author Adil * @date 2020-04-05 18:55:09 * 模拟客户端 */ public class ClientTCP { public static void main(String[] args) throws IOException { System.out.println("客户端发送请求..."); //1.创建Socket,同时向服务端发送连接请求,等待服务端接收 Socket socket = new Socket("127.0.0.1", 8080); //2.通过Socket获取输入流 OutputStream outputStream = socket.getOutputStream(); //3.通过输出流向服务端写入数据 outputStream.write("服务端你好,我是客户端,初次见面请多关照...".getBytes()); //4.客户端读取服务端写回的数据 InputStream inputStream = socket.getInputStream(); byte[] bytes = new byte[1024]; String message = new String(bytes, 0, inputStream.read(bytes)); System.out.println("客户端读取服务端返回的数据:" + message); //5.关闭资源 outputStream.close(); socket.close(); } }
package com.tcp; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; /** * @author Adil * @date 2020-04-05 18:54:59 * 模拟服务端 */ public class ServerTCP { public static void main(String[] args) throws IOException { System.out.println("服务端启动,等待连接..."); //1.创建ServerSocket对象,绑定端口 ServerSocket serverSocket = new ServerSocket(8080); //2.接收客户端发送过来的连接,返回Socket对象 Socket socket = serverSocket.accept(); //3.通过Socket获取输入流,用来读取客户端发送过来的数据 InputStream inputStream = socket.getInputStream(); //4.通过输入流读取数据 byte[] bytes = new byte[1024]; int len = inputStream.read(bytes); String message = new String(bytes, 0, len); System.out.println("服务端读取客户端发送过来的数据:" + message); //5.服务端写回数据给客户端 OutputStream outputStream = socket.getOutputStream(); outputStream.write("客户端你好!我会关照你的!".getBytes()); //6.关闭资源 inputStream.close(); socket.close(); } }
原文地址:https://www.cnblogs.com/ubiquitousShare/p/12641636.html