这个文档就是针对概念记录具体的跟踪过程
一 TCP握手/挥手
1 服务端代码
package debug.io.bio.server;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Objects;
/**
* <p>BIO的服务端</p>
* @since 2022/5/20
* @author dingrui
*/
public class ServerSocketTest {
private static final int PORT = 9992;
public static void main(String[] args) throws IOException {
// 创建服务端
ServerSocket server = new ServerSocket();
// 绑定端口
server.bind(new InetSocketAddress(PORT));
// 监听端口
Socket socket = server.accept();
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter writer = new PrintWriter(socket.getOutputStream());
writer.println("服务端 -> 连接ok");
writer.flush();
String msg;
while (!"bye".equalsIgnoreCase(msg = reader.readLine()) && Objects.nonNull(msg)) {
System.out.println("客户端 <- " + msg);
writer.println("服务端 -> " + msg);
writer.flush();
msg = null;
}
reader.close();
writer.close();
socket.close();
server.close();
}
}
2 客户端代码
package debug.io.bio.client;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.Scanner;
/**
* <p>BIO客户端</p>
* @since 2022/5/20
* @author dingrui
*/
public class SocketTest {
private static final String IP = "127.0.0.1";
private static final int PORT = 9992;
public static void main(String[] args) throws IOException {
Socket socket = new Socket();
socket.connect(new InetSocketAddress(IP, PORT));
PrintWriter writer = new PrintWriter(socket.getOutputStream());
Scanner scanner = new Scanner(System.in);
String readLine = "";
// 线程负责读
Thread t = new Thread(() -> {
int size = -1;
byte[] bytes = new byte[1024];
StringBuilder sb = new StringBuilder(1024);
try {
while ((size = socket.getInputStream().read(bytes, 0, bytes.length)) > 0) {
String msg = new String(bytes, 0, size, "UTF-8");
sb.append(msg);
if (msg.lastIndexOf("\n") > 0) {
System.out.println(sb.toString());
sb.delete(0, sb.length());
}
if (Thread.currentThread().isInterrupted()) break;