Проблема с вашим кодом в том, что вы читаете из входного потока сокета, который никогда не закрывается.
DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(f)));
byte array[] = new byte[1024*8];
count =d.read(array);
while(count >0){
out.write(array,0,count);
count =d.read(array);
System.out.println("byte out: "+count);
}
//this never prints
System.out.println("last read: "+count);
d.read(array)
активно пытается прочитать из сокета, блокируя дополучает что-то.Поскольку InputStream активно блокируется, он никогда не возвращает значение, меньшее или равное 0. Это связано с тем, что поток ожидает следующий пакет с другого конца сокета.
Закрытие сокета после отправки файла должнопомочь тебе.В этом случае достигается конец потока и возвращается InputStream.
Примечание : InputStream, с которого вы читаете, будет (если сокет закрыт) возвращать -1, как вы можете видеть в JavaDoc .
В вашем случае это, однако, может быть нежизнеспособным!
Вы хотите ответить клиенту "хорошо" или "ошибка".Если вы закроете сокет, вы не сможете ответить через тот же сокет.Решение этой проблемы может быть сложным.
Эта ситуация немного сложнее.Большинство фреймворков имеют Thread, который читает из SocketInputStream и передает возвращаемое значение некоторому обработчику (при блокировке ввода-вывода).Ваш цикл while - это основной цикл чтения внутри Thread.Этот цикл завершится только в том случае, если соединение потеряно, и поэтому System.out.println("last read: "+count);
можно изменить на System.out.println("disconnected");
Для простоты: вы можете дать оценку того, как big файл будет и (только для целей тестирования) напишите что-то вроде этого:
DataOutputStream out = new DataOutputStream(new
BufferedOutputStream(new FileOutputStream(f)));
byte array[] = new byte[/* Big enough */ 1024 * 1024 * 8];
d.read(array); // Read the file content
out.write(array); // Write to the file
//this never prints
System.out.println("last read: "+count);
Я пропустил здесь каждую проверку ошибок!Это означает, что вы читаете только один пакет с сервера, который должен быть файлом.