2016-05-08 4 views
0

を読んで絶えず方法をお読みください。スレーブがバイト配列を格納する場所。しかし、ファイルがクライアントからマスタに正しく送信されるときに、スレーブにバイト配列をスレーブに送信すると、入力ストリームのreadメソッドは常に0を読み込みます。InputStreamが、私は最初、私のマスターに、クライアントから店のバイト配列をファイルを転送してからスレーブに送信しています0

//このメソッドはファイルをマスターに書き込みます

このメソッドは、バイト配列と

public byte[] readFile() { 

    byte[] bytearray = null; 
    try { 
     int currentTot = 0; 
     int filesize = Integer.parseInt(this.read()); 
     System.out.println(filesize); 
     bytearray = new byte[filesize]; 
     InputStream is = socket.getInputStream(); 
     int bytesRead; 

     bytesRead = is.read(bytearray, 0, bytearray.length); 
     currentTot = bytesRead; 
     int count = 0; 
     do { 
      bytesRead = is.read(bytearray, currentTot, (bytearray.length - currentTot)); 
      if (bytesRead > 0) { 
       currentTot += bytesRead; 
       count = 0; 
      } else { 
       count++; 
       System.out.println("count " + count); 
      } 
     } while (bytesRead > -1); 
     System.out.println(currentTot); 
     // bos.write(bytearray, 0, currentTot); 
     // bos.flush(); 
     // bos.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return bytearray; 
} 
//This method writes from the master to the slave 
public void writeByte(byte[] m) { 
     this.write(String.valueOf(m.length)); 
     System.out.println("File side inside sender" + m.length); 
     // byte[] bytearray = m; 
     OutputStream os; 
     try { 
      os = socket.getOutputStream(); 
      os.write(m, 0, m.length); 
      os.flush(); 
      //os.close(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 

興味深いことに、私はから私のバイト配列を送信した後、私は私の出力ストリームを閉じた場合、スレーブにマスタからのバイト配列としてマスターにファイルを読み込む//

public void writeFile(File file) { 
    try { 
     this.write(String.valueOf(file.length())); 

     byte[] bytearray = new byte[(int) file.length()]; 
     FileInputStream fin = new FileInputStream(file); 
     BufferedInputStream bin = new BufferedInputStream(fin); 
     bin.read(bytearray, 0, bytearray.length); 
     BufferedOutputStream bos; 
     OutputStream os = socket.getOutputStream(); 
     bos= new BufferedOutputStream(os); 
     bos.write(bytearray, 0, bytearray.length); 
     bos.flush(); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

私のマスターそれはうまく動作します。しかし、スレーブがマスターとさらに通信する必要があるため、ストリームを閉じることはできません。前もって感謝します。

public void write(String output) { 
    if (pw == null) 
     this.openWriter(); 
    pw.println(output); 
} 
public String read() { 
    try { 
     if (br == null) { 
      if (this.socket != null) 
       br = new BufferedReader(new InputStreamReader(this.socket.getInputStream())); 
     } 
     return br.readLine(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return null; 
} 

答えて

1

受信者のファイルの長さが誤っています。ゼロが得られているので、ゼロ長のバイト配列を作成しているので、read()はゼロを返します。

あなたはDataOutputStream.writeLong()を経由して長さを送信しDataInputStream.readLong()を経由して、それを読む必要があります。そしてあなたの送受信コードも間違っています。完全なコードについては、my answer hereを参照してください。

+0

私はそれをテストしません。 byteArray全体が読み取られています。私はブレークポイントを入れてチェックしました。そのバイト配列の最後の塊である – Krish

+0

また、あなたの答えをチェックしました。私はあなたがなぜfileSize> 0まで読む必要があるのか​​分からないのは、読み込み用のJavadocが、ストリームには何も残っていません。私はその解決策を試してみました。ストリームを使ってマスターからスレーブの1つにバイト配列を送信すると、最後に読み取られなかったビットがスレーブに余分にプッシュされます。 – Krish

+0

はい、ファイルの長さを誤読しています。あなたはそれを文字列として送信し、その1バイトだけを読み取っています。 'read()'がゼロを返すことができる唯一の方法は、長さをゼロにすることです。引用された答えは、ストリームの終わりが送信されたファイルを区切るために使用できない複数のファイルを送信することに関する質問です。 – EJP

関連する問題