Я пытаюсь реализовать программу передачи изображений UDP в Java. Отправитель разбивает изображение на 1024-байтовые пакеты, где первые 2 байта являются коротким, несущим порядковый номер, а 3-й байт является флагом, указывающим, является ли пакет последним или нет.
Когда я выполняю получатель и отправляю изображение с использованием отправителя, переданное изображение является неполным и имеет странные цвета.
В других случаях, когда я запускаю получателя, он зависает после отправки нескольких сотен пакетов.
Вот код для получателя, который принимает полученные пакеты и записывает их в поток байтов.
double DATAGRAM_MAX_SIZE = 1024;
byte[] recieveData = new byte[(int) DATAGRAM_MAX_SIZE];
ByteArrayInputStream bais = new ByteArrayInputStream(recieveData);
DataInputStream dis = new DataInputStream(bais);
// Loop until all packets received
byte isLast = 0;
while(true) {
receievePacket = new DatagramPacket(recieveData, recieveData.length);
try {
receieveSocket.receive(receievePacket);
} catch (IOException e) {
System.out.println("Error receieving packet");
e.printStackTrace();
}
Short sequenceNum = dis.readShort();
isLast = dis.readByte();
System.out.println(recieveData[0] + " " + recieveData[1] +" " + recieveData[2]);
if (!seenSeq.contains(sequenceNum)) {
seenSeq.add(sequenceNum);
bos.write(recieveData, 3, (int) DATAGRAM_MAX_SIZE-3);
}
dis.reset();
// Terminate loop if last packet received
if (isLast == 1) {
break;
}
}
// Byte array to hold image data from stream
byte[] imageData = bos.toByteArray();
Всякий раз, когда получателю удается получить все пакеты, здесь получается изображение: