Мне нужно передать ~100 МБ данных через ServerSocket с помощью NIO, но я не могу понять, как это сделать, не прерывая передачу в любом месте/сохраняя состояние передачи.
Моя первая идея заключалась в том, чтобы отправить размер файла, видимо, я не могу отправить размер таких больших файлов, потому что он даже не помещается в ОЗУ сразу. Тогда я подумал, почему бы просто не передавать до тех пор, пока ничего не будет получено, но именно тогда возникает проблема.
Даже если я пишу данные на стороне сервера все время
FileChannel fc = new FileInputStream(f).getChannel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
while(fc.read(buffer) > 0) {
buffer.flip();
while(channel.write(buffer) > 0);
buffer.clear();
}
, но потому что в передаче файлов должны быть перерывы некоторое время постоянное чтение данных и взлом, когда ничего не доступно, было плохой идеей.
Я не могу понять, как я могу сообщить клиенту, есть ли еще данные, не отправляя каждый фрагмент данных в виде нового пакета с кодом операции и т. д., или это вообще возможно?
Мне также интересно, есть ли лучший способ отправить весь буфер, чем ниже
while(channel.write(buffer) > 0);