2015-10-09 4 views
1

Я пытаюсь использовать сокеты в java для загрузки файлов из Интернета. Моя программа работает правильно и компилируется, но когда я иду, чтобы проверить файл после этого, то его размер равен 0 байтам. Я не уверен, где я ошибаюсь.Загрузка файлов из Интернета с использованием сокетов

BufferedInputStream download = new BufferedInputStream(socket.getInputStream()); 
FileOutputStream newFile = new FileOutputStream(fileName); 
output.print("GET " + address + " HTTP/1.0\r\n\n"); 
output.flush(); 
byte[] input = new byte[10240]; 
int finished = download.read(input, 0, 10240); 

Я тогда время цикла, что гарантирует, что законченный не равен -1 и призывает к более байт данных при записи его в файл с помощью:

newFile.write(input, 0, finished); 

Я знаю, что мой socket настроен правильно, так как я могу загрузить и прочитать HTTP-заголовок с ним. Моя программа никогда не вводит цикл while для записи данных, функция read() возвращает -1 сразу. Как я могу исправить свой код?

Спасибо!

Редактировать: Я вижу, что это было отмечено как дубликат для ответа, который использовал класс URL, чтобы сделать то же самое. Я не могу использовать URL или URLConnection.

+0

Почему * описать * в 'while' цикла, когда вы могли бы * отвечал * это? Где вы читаете заголовки? Где вы проверяете код возврата HTTP? – EJP

+0

@EJP Я не думал, что мне нужно опубликовать цикл while, так как он даже не запускается, потому что «download.read (input, 0, 10240)» сразу возвращает «-1». – Shozzking

+0

@EJP Я отправил остальную часть моего кода, связанного с моей проблемой – Shozzking

ответ

2

Вы не читаете заголовки правильно. Вы должны прочитать их, пока не получите пустую строку, а не нуль. Вы читаете весь ответ, когда только пытаетесь прочитать заголовки, так что нет ответа, оставшегося для чтения во второй части.

Но у вас есть еще одна проблема с BufferedReader. Вероятно, он украдет данные из следующего тела. Это редкий случай для DataInputStream.readLine(), и да, я знаю, что он устарел.

Вы также не проверяете, есть ли у вас код ошибки HTTP, что будет означать, что в ответе нет тела.

Вам не нужно инициализировать line перед циклом while.

У вас также есть недостающий \r между двумя \n s.

Все это - то, почему лучше использовать HttpURLConnection, и если вы не можете, то почему это не отличное задание.

Самый простой способ, чтобы написать эти петли является:

// headers 
while ((line = in.readLine()) != null 
{ 
    if (line.length() == 0) 
     break; // end of headers 
    // ... 
} 

// body 
while ((count = in.read(buffer)) > 0) 
{ 
    out.write(buffer, 0, count); 
} 
+0

Большое спасибо за помощь! – Shozzking

Смежные вопросы