Java演示TCP 3次握手与 4次分手

啥都不说,先上代码。
服务端:

package com.ghs.test;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServerSocket {
    private static ServerSocket serverSocket;
    private static Socket socket;

    public static void startServerSocket(int bindPort) {
        try {
            serverSocket = new ServerSocket(bindPort);
            while(true){
                socket = serverSocket.accept();
                System.out.println("连接的客户端地址和端口为:" + socket.getRemoteSocketAddress());
                socket.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        startServerSocket(6000);
    }
}

客户端:

package com.ghs.test;

import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

public class TCPClientSocket {

    private static Socket socket;

    /**
     * 是否主动发起关闭
     */
    private static boolean isLaunchClose=true;

    /**
     * 建立socket连接
     * 
     * @param bindIp
     * @param bindPort
     */
    public static void connectServerSocket(String bindIp, int bindPort) {
        try {
            socket = new Socket(bindIp, bindPort);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 关闭socket连接
     */
    public static void closeSocket(){
        try {
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        int bindPort = 6000;
        String bindIp = "192.168.1.36";
        connectServerSocket(bindIp, bindPort);
        if(!isLaunchClose){
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        closeSocket();
    }
}

先启动服务端,然后启动客户端,通过wireshark软件进行抓包。结果如下这里写图片描述

注:实际操作过程中,抓取的包可能是下面这样,不过红色部分可以不加
考虑
Java演示TCP 3次握手与 4次分手_第1张图片
附:如果你本地无法抓包,请参考
https://yq.aliyun.com/ziliao/140472

下面,简单的介绍一下,TCP的3次握手和4次分手。
先上一个经典图形。
Java演示TCP 3次握手与 4次分手_第2张图片

3次握手
当服务的启动之后,处于LISTEN状态。
当客户端执行下面的代码后,就开始了3次握手

socket = new Socket(bindIp, bindPort)

客户端首先发送一个SYN报文,服务端返回一个SYN+ACK报文,客户端再回一个ACK报文

4次分手
当客户端执行下面的代码后

socket.close();

客户端会发送一个FIN+ACK报文,服务端会响应一个ACK报文。
此时,客户端处于FIN_WAIT_2状态,服务端处于CLOSE_WAIT状态。

当服务端执行下面的代码后

socket.close();

服务端会发送一个FIN报文,进入LAST_ACK状态
客户端返回一个ACK报文,进入TIME_WAIT状态

至于TCP为什么要经过3个握手4次分手,可以参考下面这篇博文。
http://www.jellythink.com/archives/705

你可能感兴趣的:(Java网络编程)