import java.io.*;
import java.net.*;
import java.nio.charset.StandardCharsets;

public class SapaSocket {
    public static void main(String[] args) throws Exception {
        // Server menunggu di loopback pada port ephemeral pilihan sistem
        ServerSocket server = new ServerSocket(0, 1, InetAddress.getLoopbackAddress());
        System.out.println("server siap    : " + server.isBound());

        Thread pegawaiServer = new Thread(() -> {
            try (Socket sambungan = server.accept();
                 BufferedReader masuk = new BufferedReader(new InputStreamReader(
                         sambungan.getInputStream(), StandardCharsets.UTF_8));
                 PrintWriter keluar = new PrintWriter(new OutputStreamWriter(
                         sambungan.getOutputStream(), StandardCharsets.UTF_8), true)) {
                String pesan = masuk.readLine();
                keluar.println("gema: " + pesan);
            } catch (IOException e) {
                System.out.println("server galat   : " + e.getMessage());
            }
        });
        pegawaiServer.start();

        Socket klien = new Socket(InetAddress.getLoopbackAddress(), server.getLocalPort());
        try (klien;
             PrintWriter keluar = new PrintWriter(new OutputStreamWriter(
                     klien.getOutputStream(), StandardCharsets.UTF_8), true);
             BufferedReader masuk = new BufferedReader(new InputStreamReader(
                     klien.getInputStream(), StandardCharsets.UTF_8))) {
            keluar.println("halo dari Budi");
            System.out.println("terhubung      : " + klien.isConnected());
            System.out.println("alamat remote  : " + klien.getInetAddress().getHostAddress());
            System.out.println("gema diterima  : " + masuk.readLine());
        }

        pegawaiServer.join();
        System.out.println("client tertutup: " + klien.isClosed());
        server.close();
        System.out.println("server tertutup: " + server.isClosed());
    }
}
