У меня есть Java-программа, которая принимает соединения, получает HTTP-запросы и отправляет HTTP-ответы, а некоторые данные хранятся в файле (это часть кэширующего прокси). Удаление всего несущественного, мой код выглядит так:
FileInputStream fileInputStream = new FileInputStream(file);
OutputStream outputStream = socket.getOutputStream();
byte[] buf = new byte[BUFFER_SIZE];
int len = 0;
while ((len = fileInputStream.read(buf)) > 0) {
outputStream.write(buf, 0, len);
}
outputStream.flush();
socket.close();
Этот код выполняется в отдельном потоке для каждого подключенного клиента.
Когда я работаю с небольшими файлами (.htm, .gif, .swf и т. Д.), Все работает нормально (однако в браузере я не вижу ничего плохого). Но когда я загружаю большие файлы (.iso), особенно несколько файлов одновременно, когда система загружена, иногда я получаю действительно странное поведение. Браузер загружает 99,99% файла, и если количество не загруженных байтов меньше BUFFER_SIZE, загрузка останавливается на несколько секунд, а затем браузер сообщает, что произошла ошибка. Я не могу понять, что происходит, потому что все данные успешно прочитаны и даже все данные успешно записаны в outputStream. Как видите, я даже выполняю flush (), но это не дает результата.
Может кто-нибудь объяснить мне, что происходит?
EDIT
Загруженный проект на filehosting.org.
Скачать исходные файлы . Существует zip-архив с исходным кодом, Build.xml и Readme.txt. Используйте муравей, чтобы построить решение. Описанная проблема возникает в ClientManager.java, там вы найдете комментарий.