import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner;

public class UDPDnsClient {

    public static void main(String[] args) {
        final String serverAddress = "localhost";
        final int serverPort = 5959;
        try (DatagramSocket socket = new DatagramSocket()) {
            InetAddress serverIPAddress = InetAddress.getByName(serverAddress);
            Receiver receiver = new Receiver(socket);
            Thread receiverThread = new Thread(receiver);
            receiverThread.start();

            Scanner scanner = new Scanner(System.in);
            System.out.println("UDP DNS Client gestartet. Geben Sie einen DNS-Namen ein (oder 'exit' zum Beenden):");
            while (true) {
                System.out.print("DNS-Name: ");
                String dnsName = scanner.nextLine().trim();

                if (dnsName.equalsIgnoreCase("exit")) {
                    System.out.println("Client wird beendet.");
                    break;
                }

                // Sende DNS-Namen an den Server
                byte[] sendData = dnsName.getBytes();
                DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, serverIPAddress, serverPort);
                socket.send(sendPacket);
                System.out.println("Gesendet: '" + dnsName + "' mit Länge: " + sendData.length);
            }

            scanner.close();
        } catch (SocketException e) {
            System.err.println("SocketException: " + e.getMessage());
        } catch (IOException e) {
            System.err.println("IOException: " + e.getMessage());
        }
    }
}

class Receiver implements Runnable {
    private final DatagramSocket socket;

    public Receiver(DatagramSocket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            while (true) {
                byte[] receiveData = new byte[1024];
                DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
                socket.receive(receivePacket);
                String ipAddress = new String(receivePacket.getData(), 0, receivePacket.getLength());
                System.out.println("Erhaltene IP-Adresse: " + ipAddress);
            }
        } catch (IOException e) {
            System.err.println("IOException im Receiver-Thread: " + e.getMessage());
        }
    }
}