При загрузке файла из метода загрузки сокета не завершается работа

sahand_77.s спросил: 12 мая 2018 в 04:45 в: java

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

public synchronized void downloadFile(String url) throws IOException{
        try (FileOutputStream fileOutputStream = new FileOutputStream(url)) {
        int countedBytes;
        byte[] buffer = new byte[kbBlockSize];
        while ((countedBytes = input.read(buffer)) > 0)
            fileOutputStream.write(buffer, 0, countedBytes);//end while
        fileOutputStream.flush();
    }//end try with resources block
}//end method downloadFile

, и вот способ загрузки на стороне сервера

public synchronized void uploadFile(String url) throws IOException {
    try (FileInputStream fileInputStream = new FileInputStream(url)) {
        int countedBytes;
        byte[] buffer = new byte[kbBlockSize];
        while ((countedBytes = fileInputStream.read(buffer)) > 0)
            output.write(buffer, 0, countedBytes);//end while
        output.flush();
    }//end try with resources block
}//end method uploadFile

но по мере того, как вышеупомянутый метод завершил работу, метод загрузки не будет

Я был бы благодарен, если бы кто-нибудь мог помочь.


1 ответ

gagan singh ответил: 12 мая 2018 в 04:59

input.read (buffer) всегда будет больше 0, если входной поток не будет закрыт. Он будет блокироваться до самого байта или EOF.

, чтобы либо сервер должен закрыть поток, либо отправить загружайте размер отдельно, например, какой-то заголовок.

например, в http можно задать длину содержимого или использовать закодированное кодирование для указания размера данных.

Почему вы хотите создать новый протокол, вместо того, чтобы использовать что-то вроде http или ftp?