Я пытаюсь отправить массив байтов, содержащий 16 элементов, через сокеты, используя DataOutputStream на клиенте и DataInputStream на сервере.
Это методы, которые я использую для отправки/получения.
public void sendBytes(byte[] myByteArray) throws IOException {
sendBytes(myByteArray, 0, myByteArray.length);
}
public void sendBytes(byte[] myByteArray, int start, int len) throws IOException {
if (len < 0)
throw new IllegalArgumentException("Negative length not allowed");
if (start < 0 || start >= myByteArray.length)
throw new IndexOutOfBoundsException("Out of bounds: " + start);
dOutput.writeInt(len);
if (len > 0) {
dOutput.write(myByteArray, start, len);
dOutput.flush();
}
}
public byte[] readBytes() throws IOException {
int len = dInput.readInt();
System.out.println("Byte array length: " + len); //prints '16'
byte[] data = new byte[len];
if (len > 0) {
dInput.readFully(data);
}
return data;
}
Все работает нормально, и я могу напечатать длину массива байтов, массив байтов (зашифрованный текст), а затем расшифровать массив байтов и распечатать исходный открытый текст, который я отправил, но сразу после его печати в консоли программа вылетает с ошибкой OutOfMemoryError: Java heap space
.
Я читал, что обычно это происходит из-за того, что DataOutputStream не очищается, но я вызываю его внутри метода sendBytes, поэтому он должен очищать его после отправки каждого массива.
Компилятор сообщает мне, что ошибка возникает внутри readBytes в строке byte[] data = new byte[len];
, а также там, где я вызываю readBytes()
в основном методе.
Любая помощь будет оценена!
Изменить
На самом деле я получаю некоторые неожиданные результаты.
17:50:14 Server waiting for Clients on port 1500.
Thread trying to create Object Input/Output Streams
17:50:16 Client[0.7757499147242042] just connected.
17:50:16 Server waiting for Clients on port 1500.
Byte array length: 16
Server recieved ciphertext: 27 10 -49 -83 127 127 84 -81 48 -85 -57 -38 -13 -126 -88 6
Server decrypted ciphertext to: asd
17:50:19 Client[0.7757499147242042]
Byte array length: 1946157921
Я вызываю readBytes()
в цикле while, поэтому сервер будет прослушивать все, что передается через сокет. Я предполагаю, что он пытается запустить его во второй раз, хотя ничего больше не было отправлено, а переменная len
каким-то образом установлена на 1946157921. Какая логика может стоять за этим?