2017-02-03 35 views
0

Я написал небольшую программу, которая получает UDP-пакеты и сохраняет их данные в файл.Длина UDP-пакетов написана неправильно

 MulticastSocket socket = getMulticastSocket(interfaceAddress, multicastAddress, port); 
     FileOutputStream fos = null; 
     try{ 
      fos = new FileOutputStream(fileName); 
      while(true) { 
       byte[] data = new byte[BUFFER_SIZE]; 
       byte[] lengthBytes = new byte[4]; 
       DatagramPacket packet = new DatagramPacket(data, 0, data.length); 
       socket.receive(packet); 
       int length = packet.getLength(); 
       ByteBuffer lengthBB = ByteBuffer.wrap(lengthBytes); 
       lengthBB.putInt(length); 
       fos.write(lengthBB.array()); 
       fos.flush(); 
       fos.write(data, 0, length); 
       fos.flush(); 
      } 
     } 

после того, как я пытаюсь прочитать его использовать следующий код

final FileInputStream inputStream = new FileInputStream(fileName); 
byte[] length = new byte[4]; 
while (inputStream.read(length) != -1){ 
    int receivedLength = ByteBuffer.wrap(length).getInt(); 
    byte[] body = new byte[receivedLength]; 
    inputStream.read(body); 
    // doing something with body 
    length = new byte[4]; 
} 

он работает в целом, но в середине файла я получил отрицательное значение переменной receivedLength (-2147483648 и [-128 , 0, 0, 0] в представлении байтов).

BUFFER_SIZE = 10240, но я не думаю, что пакет был больше этого значения.

Вопрос: почему это произошло?

p.s. У меня нет доступа к машине, на которой был написан файл, и я не могу посмотреть на сетевой поток. У меня есть только файл.

+0

Вы считаете, что 'read()' заполняет буфер. Вы должны использовать 'DataInputStream.readFully()', что и есть. И 'DataInpitStream.readInt()'. – EJP

+0

@EJP Я попытался использовать DataInputStream, но получаю тот же результат. Я думаю, что в моем писателе есть проблема. К сожалению, я не понимаю, в чем проблема. – ViKo

ответ

0

Максимальный размер сообщения UDP - 64K. Вы сказали, что не думаете, что пакет был больше 10240, но это может быть. Попробуйте увеличить свой буфер до 64 * 1024 и посмотреть, изменит ли это результат.

+0

Не могли бы вы объяснить, почему у меня есть отрицательное значение? Я попытался протестировать его и отправить пакеты больше, чем буфер, но метод getLength вернул мне размер моего буфера (10240) – ViKo

+0

Мне нужно было поэкспериментировать, чтобы посмотреть, как это будет выглядеть, если вы попытаетесь немного подогнать слишком большое число в буфер слишком маленький. Но если ваш буфер был немного слишком мал, и вы оказались с 1 в крайнем левом разряде, он отобразился бы как отрицательное число. –