2016-09-09 2 views
0

Как всегда, у меня возникают проблемы с 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(). С одной стороны, это забавно, потому что почти только если я распечатаю размер файла в клиенте, я получаю правильный результат на сервере. С другой стороны, я не понял, как это исправить ...

ответ

0

Хорошо, я решил. Это было что-то со Сканером, метод которого nextLine() проглотил байт, который я отправлял после имени файла. Теперь я просто использую обычные InputStream и OutputStream.

Смежные вопросы