前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >简单介绍TCP三次握手的那些事

简单介绍TCP三次握手的那些事

作者头像
框架师
发布2019-09-29 15:39:57
3470
发布2019-09-29 15:39:57
举报
文章被收录于专栏:墨白的Java基地墨白的Java基地

正文

最近墨白在寻找合适的offer,遇到高频面试题,TCP三次握手的原理是什么?离我学习TCP的时间太久了,自我感觉和面试官这方面的交流不是特别优秀哇,于是又学习了一下,今天就给大家聊一聊TCP三次握手的原理以及附上代码操作;

简单概述下TCP:

TCP通信是能够实现两台计算机之间的数据交互,通信的两端,要严格区分为客户端(Client)与服务端(Server)。

两个端口通信时的步骤:

1. 服务端程序,需要事先启动,等待客户端的连接。

2. 客户端主动连接服务器端,连接成功才能通信。服务端不可以主动连接客户端。

了解完TCP概述以后我们进入今天的主题讲下TCP三次握手的原理,我们知道TCP传输数据是先有服务端在有客户端,比方服务端就相当于大表哥,客户端就相当于小表妹;

大表哥(ServerSocket)自己准备好以后(创建ServerSocket,并监听一个端口),然后创建小表妹;

第一次握手

  • 小表妹需要发送第一次请求,大表哥自然是要同意小表妹的请求,既然同意了请求,:那么大表哥就需要创建一个和小表妹对应的Socket,大表哥的Socket和小表妹的socket对应上以后;

第二次握手

  • 他们就要开始搞事情了,这个时候出现了一个通道(流),小表妹和大表哥可以互通信息了,小表妹这边的流(输出流)叫做getoutputStream(用来写入数据),比方小表妹写入的数据叫做你好,约吗?,通过流传输到大表哥那里,大表哥接受之后是需要读取小表妹给她发送的数据的,那么这个时候大表哥的流也出现了(getInputStream,这个流用来读取数据),既然读取到了数据,就需要给小表妹回消息了;

第三次握手

  • 大表哥用(getoutputStream,输出流)给小表妹回了一个老地方见!,小表妹收到这个数据以后就要读取数据(getInputStream,输入流),这样就完成了TCP通信的三次握手;

代码参考,服务端;

代码语言:javascript
复制
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();
    }
}

客户端:

代码语言:javascript
复制
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();
    }
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 框架师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档