Tcp协议是比udp协议更安全,是面向连接的协议,需要进行三次握手,因此不会造成丢包的情况。
接下来我们看看TCP协议的三次握手:
这三次握手就相当于一次访问的电话:
第一次握手:客户端电话给服务端问,你在家吗?
第二次握手:服务端受到客户端的电话,恢复到我在家。
第三次握手:客户端在恢复服务端,我一会来玩。
这就相当于TCP协议的三次握手。
接下俩我们来看看TCP协议的数据传输。
客户端:
public class TcpClient {
public static void main(String[] args) throws IOException {
while (true){
System.out.println("请输入发送给服务器端的数据:");
Scanner sc = new Scanner(System.in);
String context = sc.nextLine();
if (context.equals("12345")){
break;
}
Socket socket = new Socket("127.0.0.1",8080);
OutputStream outputStream = socket.getOutputStream();
outputStream.write(context.getBytes(StandardCharsets.UTF_8));
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int len = inputStream.read();
System.out.println("客户端接收到服务器端的响应数据:"+new String(bytes,0,len));
outputStream.close();
socket.close();
}
}
}
服务端:(多线程)
public class TcpServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8080);
System.out.println("服务器端启动成功!");
while (true){
Socket socket = serverSocket.accept();
new Thread(new Runnable() {
@Override
public void run() {
try {
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int len = inputStream.read(bytes);
System.out.println("服务器端读取到的数据:"+new String(bytes,0,len));
OutputStream outputStream = socket.getOutputStream();
String resp="我收到了,"+ UUID.randomUUID().toString();
outputStream.write(resp.getBytes(StandardCharsets.UTF_8));
inputStream.close();
socket.close();
}catch (Exception e){
}
}
}).start();
}
}
}
采用了输入输出流来进行数据的传输。
从以上代码可以看出,每次客户端发送出数据都要接收响应服务区,而服务器端都要返回一个随机的数给客户端表示我已经收到了。此外,当开启多个客户端的时候,我们也不用担心服务器端在处理第一个客户端发来的数据,因为服务器端开启了多线程,可以接收多个客户端发来的数据。
注:以上代码是学习蚂蚁课堂架构师-余胜军的课程总结的笔记,感兴趣的小伙伴可以去看看!