Итак, я делаю Java-программу с сервером и клиентом, и я отправляю Zip-файл с сервера на клиент. Я почти полностью отсылаю файл. Но, получив, я обнаружил некоторую несогласованность. Мой код не всегда получает полный архив. Я предполагаю, что это заканчивается до того, как BufferedReader имеет всю полноту. Вот код для клиента:Как я могу убедиться, что я получил весь файл через поток сокетов?
public void run(String[] args) {
try {
clientSocket = new Socket("jacob-custom-pc", 4444);
out = new PrintWriter(clientSocket.getOutputStream(), true);
in = new BufferedInputStream(clientSocket.getInputStream());
BufferedReader inRead = new BufferedReader(new InputStreamReader(in));
int size = 0;
while(true) {
if(in.available() > 0) {
byte[] array = new byte[in.available()];
in.read(array);
System.out.println(array.length);
System.out.println("recieved file!");
FileOutputStream fileOut = new FileOutputStream("out.zip");
fileOut.write(array);
fileOut.close();
break;
}
}
}
} catch(IOException e) {
e.printStackTrace();
System.exit(-1);
}
}
Итак, как я могу быть уверен, что весь архив существует до того, как он напишет файл?
Зачем нужен размер файла, если TCP является надежным протоколом, и он говорит, что вы используете endofstream, чтобы вы сами могли определить размер (и вам это не нужно на самом деле)? – Val
@Val Конец потока работает только в том случае, если сокет закрыт после записи файла. Это может быть достаточно для его простого приложения. В общем случае отправки нескольких вещей по одному соединению вам нужен другой способ сделать это. – stonemetal
Отлично, я закончил тем, что использовал этот подход. Он выполняет цикл do-while до тех пор, пока общее количество байтов не будет равно количеству отправленных вперед байтов. Благодаря главному - и Валу тоже за помощь. Вы, ребята, намного лучше, чем я. :) – Jadar