Я пишу программу, которая может перемещать файлы через сокет, используя следующие методы, но когда я загружаю файл из метода сокета, загрузка в клиентскую программу не прекращает работу и выход из цикла, хотя метод загрузки в серверная сторона завершила работу. Здесь мой метод загрузки в клиенте
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
но по мере того, как вышеупомянутый метод завершил работу, метод загрузки не будет
Я был бы благодарен, если бы кто-нибудь мог помочь.
input.read (buffer) всегда будет больше 0, если входной поток не будет закрыт. Он будет блокироваться до самого байта или EOF.
, чтобы либо сервер должен закрыть поток, либо отправить загружайте размер отдельно, например, какой-то заголовок.
например, в http можно задать длину содержимого или использовать закодированное кодирование для указания размера данных.
Почему вы хотите создать новый протокол, вместо того, чтобы использовать что-то вроде http или ftp?