目录

前言

TCP协议基本介绍

TCP协议的特点

TCP的可靠传输实现

Java TCP核心API

TCP实现回响服务器与客户端实现

服务端

客户端

总结


前言

前篇文章介绍了udp来实现建立连接的过程,此篇文章着重于介绍tcp的可靠传输以及tcp建立连接的过程。文章内容如有遗漏或者错误,欢迎大家评论区留言。


TCP协议基本介绍

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层协议。它是互联网协议套件(TCP/IP)的核心协议之一,用于在不可靠的网络环境中提供可靠的数据传输服务。

TCP协议的特点

1. 有连接 —— 通信前必须先建立连接(三次握手),结束后释放连接(四次挥手)
2. 可靠传输 —— 通过 ACK、超时重传、序列号、校验和等机制保证数据不丢不乱不错
3. 面向字节流 —— 数据被视为无结构的字节流,不保留消息边界
4. 全双工 —— 双方可以同时收发数据

相比于UDP,TCP最大优势就是可靠传输

TCP的可靠传输实现

确认应答机制(ACK) - 接收方收到数据后发送确认                                                          
超时重传机制 - 发送方在超时后未收到ACK则重传
序列号机制 - 每个字节都有序列号,用于排序和去重                                                    
滑动窗口机制 - 流量控制,允许连续发送多个数据段                                                                        
流量控制 - 通过窗口大小告知对方自己能接收的数据量                                                                     
拥塞控制 - 包括慢开始、拥塞避免、快重传、快恢复                                                                        
校验和 - 检测数据是否损坏                                                                                                    
数据排序 - 将乱序到达的数据重新排序      、

Java TCP核心API

ServerSocket:用于服务器监听端口,通过accept方法返回Socket形式数据

Socket:用于通信端点,通过InputStream和OutputStream来读写数据

重点:ServerSocket实例的对象通过accept方法返回的是一个Socket对象,因此多数代码是这么写的:Socket socket = serverSocket.accept();

再通过socket对象来获取字节流对用的方法

TCP实现回响服务器与客户端实现

服务端

服务器的实现大体上也和udp的实现类似,分为四个步骤

1.接受信息,2.计算响应,3.返回响应,4.打印日志

import jdk.internal.util.xml.impl.Input;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class test5 {
    public static void main(String[] args) throws IOException {
        TcpS1 tcps1 = new TcpS1(1234);
        tcps1.start();
    }
}

class TcpS1 {
    ServerSocket serverSocket = null;
    private int port;
    TcpS1(int port) throws IOException {
        serverSocket = new ServerSocket(port);
    }

    public void start() throws IOException {
        System.out.println("服务器启动");
        Socket socket = serverSocket.accept();
        InputStream in = socket.getInputStream();
        OutputStream out = socket.getOutputStream();
        Scanner scanner = new Scanner(in);

        while(true){
            //1.接受信息
            if(!scanner.hasNextLine()){
                System.out.println("通信结束");
                return;
            }
            String req = scanner.nextLine();


            //2.计算响应
            String resp = prgress(req);


            //3.返回响应
            PrintWriter printWriter = new PrintWriter(out);
            printWriter.println(resp);
            printWriter.flush();

            //4.打印日志
            System.out.printf("%s,%d,req = %s,resp = %s\n",socket.getInetAddress(),socket.getPort(),req,resp);


        }
    }


//计算响应的方法,由于是回响服务器,返回的响应就是发送的请求
    private String prgress(String req) {
        return req;
    }
}

客户端

客户端实现通信也可分为四个步骤:
1.接受用户写的信息,2.将信息发给服务端,3.接受服务端的响应,4.打印服务端的响应

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class test4{
    public static void main(String[] args) throws IOException {
        TcpC1 tcpC1 = new TcpC1(1234,"127.0.0.1");
        tcpC1.start();
    }
}

class TcpC1{
    Socket socket = null;

    public TcpC1(int port,String ip) throws IOException {
        socket = new Socket(ip,port);
    }

    public void start() throws IOException {
        System.out.println("客户端启动");
        InputStream in = socket.getInputStream();
        OutputStream out = socket.getOutputStream();
        PrintWriter printWriter = new PrintWriter(out);
        //第一个scanenr对象用来读取用户的输入
        Scanner scanner = new Scanner(System.in);
        //第二个scanner对象是用来建立连接的
        Scanner scanner1 = new Scanner(in);

        while(true){
            //1.读取用户输入数据
            String req = scanner.nextLine();

            //2.将请求发送给服务器
            printWriter.println(req);
            printWriter.flush();

            //接受服务端发来的请求
            String resp = scanner1.nextLine();

            //打印响应
            System.out.println(resp);

        }
    }
}

对于tcp服务器的启动,tcp要求必须先启动服务端再启动客户端才行。因为tcp要实现可靠传输里面的三次握手的过程,如果服务端没有启动则没法实现三次握手的过程从而也就无法实现连接过程。


总结

对于接受消息的服务端需要先绑定端口因此要运用serversocket对象来绑定端口然后再传递给socket对象,而客户端可以直接通过socket来绑定ip和端口来建立连接,因此二者在建立连接之前的步骤有些许差别

更多推荐