Ajudar para entender o código

iae galera,
sou iniciante em programação e gostaria de um auxilio para entender esses códigos através de comentários… já realizei alguns, porém não consegui compreender o código por completo.
basicamente sei que ele está utilizando threads para conectar múltiplos clientes, utilizando um servidor que fica em um looping infinito aguardando a próxima solicitação de conexao. Se alguem mais experiente puder me ajudar a comentar esse código ficarei grato :smile:

import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class Servidor {

public static void main(String[] args) {
    ServerSocket srv=null;
    Socket cli;
    int porta= 3344;
    try {
        srv = new ServerSocket(porta); //bind
        while(true){//servidor entra em looping infinito
            System.out.println("Aguardando o cliente....");
            cli = srv.accept();
            Atende t = new Atende(cli);
            t.start();
        } //fim do while do looping
    } catch (Exception e) {
        System.out.println("ERRO: "+e.getMessage());
        //srv.close();
    }
}

}

import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class Controle {

public static void main(String[] args) {
    ServerSocket srv=null;
    Socket cli;
    int porta= 3345;
    try {
        srv = new ServerSocket(porta); //bind
        while(true){
            System.out.println("Aguardando o cliente....");
            cli = srv.accept();
            Atende t = new Atende(cli);
            t.start();
        }
    } catch (Exception e) {
        System.out.println("ERRO: "+e.getMessage());
        //srv.close();
    }
}

}

import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;

public class Cliente {

public static void main(String[] args) {
    Socket cli;
    PrintStream saida;
    Scanner in, in2;
    
    try {
        cli = new Socket("localhost", 3345);//solicitando conexao
        in2 = new Scanner(System.in);
        saida = new PrintStream(cli.getOutputStream());//realiza papel complementar ao in da classe servidor
        String msg = in2.nextLine();
        saida.println(msg);//mandando string para o servidor
        in = new Scanner(cli.getInputStream());
        String linha = in.nextLine();
        System.out.println("Recebido: "+ linha);            
        cli.close();//encerrar conexao
    } catch (Exception e) {
        System.out.println("ERRO: "+ e.getMessage());
    }
}

}

import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;

public class AtendeControle extends Thread{
Scanner in;
Scanner inServer;
PrintStream saida;
PrintStream saidaCli;
Socket cli;
Socket server;
public AtendeControle(Socket cli){
this.cli = cli;
}

@Override
public void run(){
    try{
        System.out.println("Conectado com "+
                cli.getInetAddress().getHostAddress());
        in = new Scanner(cli.getInputStream());
        String linha = in.nextLine();
        System.out.println("Recebido: "+ linha);
        
        server = new Socket("localhost",3344);
       
        saida = new PrintStream(server.getOutputStream());
        saida.println(linha);
        
        inServer = new Scanner(server.getInputStream());
        linha = inServer.nextLine();
        
        saidaCli = new PrintStream(cli.getOutputStream()); 
        saidaCli.println(linha);
        
        cli.close();
    }catch(IOException e){
        System.out.println("ERRO:"+e.getMessage());
    }
}

}

import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;

public class Atende extends Thread{
Scanner in;
PrintStream saida;
Socket cli;

public Atende(Socket cli){
    this.cli = cli;
}

@Override
public void run(){
    try{
        System.out.println("Conectado com "+
                cli.getInetAddress().getHostAddress());
        in = new Scanner(cli.getInputStream());
        String linha = in.nextLine();
        System.out.println("Recebido: "+ linha);
        int cont = linha.length();
        saida = new PrintStream(cli.getOutputStream());
        saida.println(cont);            
        cli.close();
    }catch(IOException e){
        System.out.println("ERRO:"+e.getMessage());
    }
}

}