import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.nio.charset.StandardCharsets;

public class ObrolanUdp {
    public static void main(String[] args) throws Exception {
        // Server UDP menunggu paket lalu membalas ke alamat pengirim
        DatagramSocket server = new DatagramSocket(0, InetAddress.getLoopbackAddress());

        Thread pegawaiServer = new Thread(() -> {
            try {
                byte[] penyangga = new byte[1024];
                for (int i = 1; i <= 3; i++) {
                    DatagramPacket masuk = new DatagramPacket(penyangga, penyangga.length);
                    server.receive(masuk);

                    String isi = new String(masuk.getData(), 0, masuk.getLength(),
                            StandardCharsets.UTF_8);
                    String balasan = "gema-" + i + ": " + isi;
                    byte[] dataBalasan = balasan.getBytes(StandardCharsets.UTF_8);
                    DatagramPacket keluar = new DatagramPacket(
                            dataBalasan, dataBalasan.length, masuk.getAddress(), masuk.getPort());
                    server.send(keluar);
                }
            } catch (Exception e) {
                System.out.println("server galat : " + e.getMessage());
            }
        });
        pegawaiServer.start();

        try (DatagramSocket klien = new DatagramSocket(0, InetAddress.getLoopbackAddress())) {
            byte[] penyangga = new byte[1024];
            for (String pesan : new String[]{"ping-1", "ping-2", "ping-3"}) {
                byte[] data = pesan.getBytes(StandardCharsets.UTF_8);
                DatagramPacket kirim = new DatagramPacket(
                        data, data.length, InetAddress.getLoopbackAddress(), server.getLocalPort());
                klien.send(kirim);

                DatagramPacket terima = new DatagramPacket(penyangga, penyangga.length);
                klien.receive(terima);
                String balasan = new String(terima.getData(), 0, terima.getLength(),
                        StandardCharsets.UTF_8);
                System.out.println("klien kirim  : " + pesan);
                System.out.println("server balas : " + balasan);
            }
        }
        pegawaiServer.join();
        server.close();
    }
}
