У меня проблема на моем сервере, после того, как я отправляю файл с X-байтами, я отправляю строку, сообщающую, что этот файл закончился, и приходит другой файл, например
FILE: a SIZE: Y\r\n
send Y bytes
FILE a FINISHED\r\n
FILE b SIZE: Z\r\n
send Z byes
FILE b FINISHED\r\n
FILES FINISHED\r\n
В моем клиенте он не получает должным образом.
Я использую readline (), чтобы получить командные строки после чтения байтов Y или Z из сокета.
С одним файлом он работает нормально, с несколькими файлами он работает редко (да, я не знаю, как он работал один или два раза)
Вот код, который я использую для передачи двоичного файла
public static void readInputStreamToFile(InputStream is, FileOutputStream fout,
long size, int bufferSize) throws Exception
{
byte[] buffer = new byte[bufferSize];
long curRead = 0;
long totalRead = 0;
long sizeToRead = size;
while(totalRead < sizeToRead)
{
if(totalRead + buffer.length <= sizeToRead)
{
curRead = is.read(buffer);
}
else
{
curRead = is.read(buffer, 0, (int)(sizeToRead - totalRead));
}
totalRead = totalRead + curRead;
fout.write(buffer, 0, (int) curRead);
}
}
public static void writeFileInputStreamToOutputStream(FileInputStream in, OutputStream out, int bufferSize) throws Exception
{
byte[] buffer = new byte[bufferSize];
int count = 0;
while((count = in.read(buffer)) != -1)
{
out.write(buffer, 0, count);
}
}
только для заметки, я мог бы решить заменить readline на этот код:
ByteArrayOutputStream ba = new ByteArrayOutputStream();
int ch;
while(true)
{
ch = is.read();
if(ch == -1)
throw new IOException("Conecção finalizada");
if(ch == 13)
{
ch = is.read();
if(ch == 10)
return new String(ba.toByteArray(), "ISO-8859-1");
else
ba.write(13);
}
ba.write(ch);
}
PS: "is" - это мой поток ввода из socket: socket.getInputStream ();
до сих пор я не знаю, является ли это лучшей реализацией, я пытаюсь выяснить