作者:廖劫讲 | 来源:互联网 | 2023-07-10 19:26
篇首语:本文由编程笔记#小编为大家整理,主要介绍了TCP网络协议的三次握手及代码释义相关的知识,希望对你有一定的参考价值。讲解TCP协议,我们首先要了解什么是网络通讯协议
篇首语:本文由编程笔记#小编为大家整理,主要介绍了TCP网络协议的三次握手及代码释义相关的知识,希望对你有一定的参考价值。
讲解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();
}
}