0

У меня есть аудиопакеты с порядковым номером в начале, который составляет 4 байта.Порядок байтового массива DataInputStream int

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
DataOutputStream dos = new DataOutputStream(baos); 
dos.writeInt(sequenceNumber); 

получает пакеты в случайном порядке, которые я затем поместить в буфер, так что массив массивов.

Мне было интересно, что было бы лучшим способом заказать пакеты по порядковому номеру.

я получить номер последовательности, как:

ByteArrayInputStream bos = new ByteArrayInputStream(udpPacketBytes); 
DataInputStream ds = new DataInputStream(bos); 
int receivedValue = ds.readInt(); 

Есть ли способ без удаления порядкового номера, который можно заказать весь массив байт указанного номером последовательности?

+0

Я предполагаю, что вы имеете в виду «весь массив байтов» **, но ** сказал порядковый номер « –

+0

Итак, я пытаюсь заказать массив байт-массивов, массивы байтов содержат аудио и порядковый номер, я хочу заказать номер последовательности, после чего я могу воспроизвести звук в правильном порядке –

ответ

0

Вы можете сделать

byte[] bytes = new byte[ds.available()]; 
ds.readFully(bytes); 

, чтобы получить оставшиеся байты.

Для обеспечения того, чтобы пакеты находились в первоначальном порядке, вам необходимо проверить порядковый номер на 1 больше, чем на предыдущие. Если нет, вам нужно сохранить пакеты по порядковым номерам и переупорядочить их. Более сложная проблема заключается в том, что когда пакет упал, вам нужно попросить снова.

Вы можете использовать что-то вроде

public class OrderManager { 
    int nextSequence = 0; 
    final SortedMap<Integer, byte[]> buffered = new TreeMap<>(); 
    final Consumer<byte[]> consumer; 

    public OrderManager(Consumer<byte[]> consumer) { 
     this.consumer = consumer; 
    } 

    public void accept(int num, byte[] bytes) { 
     if (num == nextSequence) { 
      consumer.accept(bytes); 
      nextSequence++; 
      while (buffered.firstKey() == nextSequence) { 
       consumer.accept(buffered.remove(buffered.firstKey())); 
       nextSequence++; 
      } 
     } else { 
      buffered.put(num, bytes); 
     } 
    } 
} 

Поскольку из пакетов порядка являются редкими, но потерянные пакеты довольно часто можно лечить в пакетах порядке, как если бы он был потерян и отправить пакет производителя чтобы отправить его снова.

+1

, как этот порядок? –

+0

@ user3667111 Что значит? –

+0

Итак, я пытаюсь заказать массив байт-массивов, массивы байтов содержат аудио и порядковый номер, я хочу заказать порядковый номер, после чего я могу воспроизвести аудио в правильном порядке. –