正文
最近墨白在寻找合适的offer,遇到高频面试题,TCP三次握手的原理是什么?离我学习TCP的时间太久了,自我感觉和面试官这方面的交流不是特别优秀哇,于是又学习了一下,今天就给大家聊一聊TCP三次握手的原理以及附上代码操作;
简单概述下TCP:
TCP通信是能够实现两台计算机之间的数据交互,通信的两端,要严格区分为客户端(Client)与服务端(Server)。
两个端口通信时的步骤:
1. 服务端程序,需要事先启动,等待客户端的连接。
2. 客户端主动连接服务器端,连接成功才能通信。服务端不可以主动连接客户端。
了解完TCP概述以后我们进入今天的主题讲下TCP三次握手的原理,我们知道TCP传输数据是先有服务端在有客户端,比方服务端就相当于大表哥,客户端就相当于小表妹;
大表哥(ServerSocket)自己准备好以后(创建ServerSocket,并监听一个端口),然后创建小表妹;
第一次握手
第二次握手
第三次握手
代码参考,服务端;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
TCP服务端实现步骤:
1.创建服务端ServerSocket,绑定端口号9999
2.同意客户端的连接
3.得到输入流,读取数据
4.得到输出流,写数据
5.关闭资源
*/
public class TCPServer {
public static void main(String[] args) throws IOException {
System.out.println("墨白启动啦...");
// 1.创建墨白ServerSocket,绑定端口号9999
ServerSocket ss = new ServerSocket(9999);
// 2.同意小柠檬的请求
Socket socket = ss.accept(); // 阻塞方法
// 3.得到输入流,读取数据
InputStream in = socket.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf); // 阻塞方法
System.out.println("墨白收到: " + new String(buf, 0, len));
// 4.得到输出流,写数据
OutputStream out = socket.getOutputStream();
out.write("老地方见!".getBytes());
// 5.关闭资源
out.close();
in.close();
socket.close();
ss.close();
}
}
客户端:
package com.itheima.demo02TCP练习;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
/**
TCP客户端实现步骤:
1.创建客户端Socket连接服务器
2.得到输出流,写数据
3.得到输入流,读取数据
4.关闭资源
*/
public class TCPClient {
public static void main(String[] args) throws IOException {
System.out.println("小柠檬启动啦...");
// 1.创建小柠檬Socket连接墨白
Socket socket = new Socket("127.0.0.1", 9999);
// 2.得到输出流,写数据
OutputStream out = socket.getOutputStream();
out.write("你好,约吗?".getBytes());
// 3.得到输入流,读取数据
InputStream in = socket.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
System.out.println("小柠檬收到: " + new String(buf, 0, len));
// 4.关闭资源
in.close();
out.close();
socket.close();
}
}