Я пытаюсь отправить файл изображения с сервера на клиент через сокет. Сокет ранее использовался для отправки некоторых строк с сервера клиенту (с буферизованными потоками ввода / вывода).
Проблема в том, что файл изображения не может быть получен должным образом с ошибкой «Преждевременный конец файла JPEG».
Сервер сначала отправляет клиенту размер файла, затем клиент создает байт [] этого размера и начинает получать файл.
Вот коды:
Сервер:
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
//Send file size
dos.writeInt((int) file.length());
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
byte[] fileBytes = new byte[bis.available()];
bis.read(fileBytes);
bis.close();
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
bos.write(fileBytes);
bos.flush();
Клиент:
DataInputStream dis = new DataInputStream(socket.getInputStream());
//Receive file size
int size = dis.readInt();
BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
byte[] fileBytes = new byte[size];
bis.read(fileBytes, 0, fileBytes.length);
Что еще интереснее, если я оставлю сервер спать примерно на 2 секунды между отправкой размера файла и записью байта [], то изображение будет получено правильно . Интересно, существует ли какое-либо состояние гонки между сервером и клиентом