Я написал небольшую программу, которая получает 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. У меня нет доступа к машине, на которой был написан файл, и я не могу посмотреть на сетевой поток. У меня есть только файл.
Вы считаете, что 'read()' заполняет буфер. Вы должны использовать 'DataInputStream.readFully()', что и есть. И 'DataInpitStream.readInt()'. – EJP
@EJP Я попытался использовать DataInputStream, но получаю тот же результат. Я думаю, что в моем писателе есть проблема. К сожалению, я не понимаю, в чем проблема. – ViKo