2016-09-09 2 views
0

いつも私はストリームとソケットに問題があります。ここでソケットのInputStream/OutputStreamの奇妙な動作

は私のコードです:私はクライアントコードでSystem.out.println(f.length())のコメントを解除した場合

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(); 

クライアント

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(); 

Serverは、サーバーは常に権利を取得しています値はfileSizeです。しかし、私がコメントしたままにしておくと、fileSizeは、多くの場合、f.length()の後に送信すべきデータからのバイトです。一方で面白いのは、クライアントのファイルサイズを印刷するだけで、サーバー上で正しい結果が得られるからです。一方、私はどのようにそれを修正するための手がかりを持っていません...

答えて

0

私はそれを解決しました。それはScannerのもので、そのメソッドのnextLine()は、ファイル名の後に送信していたバイトを飲み込んだものでした。今は普通のInputStreamOutputStreamを使用しています。