import java.io.*;
import java.net.*;
import java.util.*;

public class Send {

    public static void main(String[] args) throws IOException {
        System.out.println("Process id: " + ProcessHandle.current().pid() + " running test against Java version " + System.getProperty("java.version") + " (" + System.getProperty("java.vm.version") + ")");
        test();
    }

    private static void test() throws IOException {
        final byte[] data = {49, 50, 51, 52, 53};
        boolean failed = false;
        try (DatagramSocket ds = new DatagramSocket(new InetSocketAddress(InetAddress.getLocalHost(), 0))) {
            final InetAddress destAddr = InetAddress.getLocalHost();
            System.out.println(destAddr.getClass().getName());
            final int port = ds.getLocalPort();
            for (int i = 1; i <= 2; i++) {
                System.out.println("---- Attempt " + i + " ----");
                final DatagramPacket packet = new DatagramPacket(data, data.length, destAddr, port);
                System.out.println(((InetSocketAddress) ds.getLocalSocketAddress()).getAddress().getClass().getName() + " -> " + destAddr.getClass().getName());
                System.out.println("sending " + Arrays.toString(packet.getData()) + " from " + ds.getLocalSocketAddress() + " to " + destAddr + ":" + port);
                ds.send(packet);
                ds.setSoTimeout(1500);
                try {
                    final DatagramPacket receivedPkt = new DatagramPacket(new byte[data.length], data.length);
                    ds.receive(receivedPkt);
                    System.out.println("successfully received " + Arrays.toString(receivedPkt.getData()) + " from " + receivedPkt.getSocketAddress());
                } catch (SocketTimeoutException e) {
                    failed = true;
                    System.out.println("receive timed out: " + e);
                }
                System.out.println("---------------------");
            }
        }
        if (failed) {
            throw new AssertionError("Test FAILED");
        } else {
            System.out.println("Test SUCCEEDED");
        }
    }
}


