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();
    }
}

猜你喜欢

转载自www.cnblogs.com/ubiquitousShare/p/12641636.html