Cliente:

import java.io.*;
import java.net.*;
 
public class codigo {
 
    public static void main(String[] args) throws IOException {
        String serverAddress = "192.168.0.20"; // Cambia a la dirección del servidor
        int port = 8080;
        try (Socket socket = new Socket(serverAddress, port);
             BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
             PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
             BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in))) {
 
            String serverResponse = in.readLine();
            System.out.println("Server: " + serverResponse);
 
            String userInput;
            while ((userInput = stdIn.readLine()) != null) {
                out.println(userInput);
 
                // Leer la salida hasta encontrar el marcador "EndOfOutput" o "EndOfCdCommand"
                while (true) {
                    String line = in.readLine();
                    if (line.equals("EndOfOutput") || line.equals("EndOfCdCommand")) {
                        break;
                    }
                    System.out.println(line);
                }
 
                if (userInput.equalsIgnoreCase("exit")) {
                    break;
                }
            }
        }
    }
}

Servidor:

import java.io.*;
import java.net.*;
 
public class Server {
 
    public static void main(String[] args) {
        try (ServerSocket serverSocket = new ServerSocket(8080)) {
            System.out.println("Server is ready and waiting for connections...");
 
            while (true) {
                Socket clientSocket = serverSocket.accept();
                new Thread(new ClientHandler(clientSocket)).start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    private static class ClientHandler implements Runnable {
        private final Socket clientSocket;
        private String currentDirectory;
 
        public ClientHandler(Socket clientSocket) {
            this.clientSocket = clientSocket;
            this.currentDirectory = System.getProperty("user.home");
        }
 
        @Override
        public void run() {
            try (
                PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
                BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()))
            ) {
                out.println("Server is ready");
 
                String inputLine;
                while ((inputLine = in.readLine()) != null) {
                    if (inputLine.equals("exit")) {
                        break;
                    } else if (inputLine.startsWith("cd")) {
                        handleCdCommand(inputLine, out);
                    } else {
                        runCommand(inputLine, out);
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    clientSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
 
        private void handleCdCommand(String cdCommand, PrintWriter out) {
            String[] commandParts = cdCommand.split(" ", 2);
            if (commandParts.length == 2) {
                String newDirectory = commandParts[1].trim();
                File newDir = new File(currentDirectory, newDirectory);
                if (newDir.isDirectory()) {
                    currentDirectory = newDir.getAbsolutePath();
                    out.println("Changed directory to: " + currentDirectory);
                    out.println("EndOfCdCommand"); // Marcador especial después de cambiar de directorio
                } else {
                    out.println("Directory not found: " + newDir.getAbsolutePath());
                }
            } else {
                out.println("Invalid cd command format");
            }
        }
 
        private void runCommand(String command, PrintWriter out) {
            try {
                Process process = Runtime.getRuntime().exec(command, null, new File(currentDirectory));
                try (BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
                    String line;
                    while ((line = br.readLine()) != null) {
                        out.println(line); // Enviar cada línea de la salida al cliente
                    }
                    out.println("EndOfOutput"); // Marcar el final de la salida después de enviar toda la salida
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}