Как всегда, у меня возникают проблемы с Streams and Sockets.Странное поведение InputStream/OutputStream в гнезде
Вот мой код:
Client
bitOut.write((f.getName() + "\n").getBytes());
//System.out.println(f.length()); // <- This is the odd part.
bitOut.write((int) f.length());
bitOut.flush();
fileIn = new FileInputStream(f);
byte buffer[] = new byte[BUFFER_SIZE];
int len;
while ((len = fileIn.read(buffer)) != -1) {
bitOut.write(buffer, 0, len);
}
fileIn.close();
Сервер
file = sc.nextLine();
int fileSize = bitIn.read(); // <- Here is my error!
System.out.println(file + ", " + fileSize);
fileOut = new FileOutputStream(folder + file);
byte buffer[] = new byte[BUFFER_SIZE];
int len;
while (fileSize > 0 && (len = bitIn.read(buffer)) != -1) {
fileOut.write(buffer, 0, len);
fileSize -= len;
System.out.println(fileSize);
}
fileOut.close();
Если я раскомментировать System.out.println(f.length())
в коде клиента, сервер всегда получает право значение в fileSize
. Но если оставить комментарий, fileSize
часто является байтом данных, которые следует отправлять после f.length()
. С одной стороны, это забавно, потому что почти только если я распечатаю размер файла в клиенте, я получаю правильный результат на сервере. С другой стороны, я не понял, как это исправить ...