【JAVA】TCP通信

本文详细介绍了TCP通信的基本原理,包括三次握手建立连接、四次挥手断开连接的过程,以及客户端如何通过Socket发送数据和服务器如何接收数据的步骤。示例代码展示了客户端发送数据并接收服务器响应,以及服务器接收文件并反馈的场景。强调了accept()和read()方法的阻塞特性,以及在TCP通信中确保可靠性的关键操作。
摘要由CSDN通过智能技术生成

【TCP通信原理】

【概述】:

  • TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象。
  • 通信之前要保证连接已经建立。
  • 通过Socket产生IO流来进行网络通信。

【连接原理】

【三次握手协议】

【四次挥手协议】

【TCP发送数据】——客户端

【步骤】:

  1. 创建客户端的Socket对象(Socket)与指定服务端连接        Socket​(String host, int port)
  2. 获取输出流,写数据        OutputStream getOutputStream​()
  3. 释放资源        void close​()

例:

    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1", 10001);
        OutputStream os = socket.getOutputStream();
        os.write("hello".getBytes(StandardCharsets.UTF_8));
        os.close();
        socket.close();
    }

【TCP接收数据】——服务器

【步骤】:

  1. 创建服务器端的Socket对象(ServerSocket)        ServerSocket​(int port)
  2. 监听客户端连接,返回一个Socket对象        Socket accept​()
  3. 获取输入流,读数据,并把数据显示在控制台        InputStream getInputStream​()
  4. 释放资源        void close​()

例:

    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(10001);
        Socket accept = ss.accept();
        InputStream is = accept.getInputStream();
        int b;
        while ((b = is.read()) != -1) {
            System.out.print((char)b);
        }
        is.close();
        ss.close();
    }

【注意】

  1. accept()方法是阻塞的,作用就是等待客户端连接
  2. 客户端创建对象并连接服务器,此时是通过三次握手协议保证跟服务器之间的连接
  3. 针对客户端来讲,是往外写的,所以是输出流
  4. 针对服务器来讲,是往里读的,所以是输入流
  5. read()方法也是阻塞的
  6. 在关流的时候,还多了一个往服务器写结束标记的动作
  7. 最后一步断开连接,通过四次挥手协议保证连接终止

【TCP通信——示例项目】

客户端:发送数据,接收服务器反馈

服务器:接收数据,给出反馈

//服务器
    public static void main(String[] args) throws IOException {
        ServerSocket ss=new ServerSocket(10002);
        Socket accept = ss.accept();
        InputStream is=accept.getInputStream();
        int b;
        while ((b= is.read())!=-1){
            System.out.println((char) b);
        }
        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(accept.getOutputStream()));
        bw.write("你谁啊?");
        bw.newLine();
        bw.flush();
        bw.close();
        is.close();
        accept.close();
        ss.close();
    }
//客户端
    public static void main(String[] args) throws IOException {
        Socket socket=new Socket("127.0.0.1",10002);
        OutputStream os=socket.getOutputStream();
        os.write("hello".getBytes(StandardCharsets.UTF_8));
        socket.shutdownOutput();
        BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String line;
        while ((line= br.readLine())!=null){
            System.out.print(line);
        }
        br.close();
        os.close();
        socket.close();
    }

【TCP通信——示例项目】

客户端:将本地文件上传到服务器。接收服务器的反馈。

服务器:接收客户端上传的文件,上传完毕之后给出反馈。

//客户端
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1", 10003);
        //读取本地文件
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("socket\\ClientDir\\img.jpg"));
        //写到服务器
        OutputStream os = socket.getOutputStream();
        BufferedOutputStream bos = new BufferedOutputStream(os);
        int b;
        while ((b = bis.read()) != -1) {
            bos.write(b);
        }
        bos.flush();
        socket.shutdownOutput();
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String line;
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }
        bis.close();
        socket.close();
    }
//服务器
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(10003);
        Socket accept = ss.accept();
        //网络中的流
        BufferedInputStream bis = new BufferedInputStream(accept.getInputStream());
        //本地中的流
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("socket\\ServerDir\\image.png");
        int b;
        while ((b = bis.read()) != -1) {
            bos.write(b);
        }
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(accept.getOutputStream()));
        bw.write("上传成功");
        bw.newLine();
        bw.flush();
        bos.close();
        accept.close();
        ss.close();
}

如需优化完整参考SocketTCP通信传输文件-Java文档类资源-CSDN下载SocketTCP通信传输文件的功能实现,在服务器端采用了多线程、线程池连接可保证服务器端同时连接更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/huihu__/85443800

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lx_Hy_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值