啥都不说,先上代码。
服务端:
java">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);
}
}
客户端:
java">package com.ghs.test;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
public class TCPClientSocket {
private static Socket socket;
javadoc">/**
* 是否主动发起关闭
*/
private static boolean isLaunchClose=true;
javadoc">/**
* 建立socket连接
*
*javadoctag"> @param bindIp
*javadoctag"> @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();
}
}
javadoc">/**
* 关闭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软件进行抓包。结果如下
注:实际操作过程中,抓取的包可能是下面这样,不过红色部分可以不加
考虑
附:如果你本地无法抓包,请参考
https://yq.aliyun.com/ziliao/140472
下面,简单的介绍一下,TCP的3次握手和4次分手。
先上一个经典图形。
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