Вы объявляете пакет 1024 bytes
byte[] buffer = new byte[1024];
На вашем сервере вы читаете каждый пакет и рассматриваете его как целое. Изображение:
byte[] buff = packet.getData(); // This is not a whole image yet
ByteArrayInputStream bain = new ByteArrayInputStream(buff);
panel.DrawImage(ImageIO.read(bain));
Например, первое изображение имеет длину 20884
, поэтому для его восстановления требуется не менее 20884/1024 + 1
пакетов.
Если вы посмотрите журнал сервера, я думаю, вы увидите какое-то исключение во время выполнения, когда Изображение не полностью построено и используется для рисования на панели.
Чтобы получить целые пакеты и восстановить образ, вам необходимо знать, как определить конец файла на сервере.
Но технически протокол UDP ненадежен, вы можете пропустить некоторые пакеты, порядок полученных вами пакетов не будет таким же, как при отправке. Так что это очень сложно сделать с помощью UDP.
Я предлагаю использовать TCP для передачи файлов. Это надежно, заказ пакетов гарантирован.