2017-07-12 10 views
0

ソケットを使用してファイルを送信しようとしていますが、ファイルを受け取ったときにそのファイルを保存できません。 デバッガ示すように、そのコードはソケットを使用してファイルを受信して​​保存する方法

bytesRead = is.read(mybytearray、現在、(mybytearray.length - 現在))で停止します。

何も起こりません。

bytesRead = is.read(mybytearray、0、mybytearray.length); - あなたが代わりに例えばOutputStreamに直接書き込む試すことができます等しい17

public static void main(String[] args) throws IOException { 
      FileOutputStream fileOutputStream = null; 
      BufferedOutputStream bufferedOutputStream = null; 
      Socket socket = null; 
      ServerSocket serverSocket = null; 
      try { 
       serverSocket = new ServerSocket(SOCKET_PORT); 
       while (true) { 
        System.out.println("Waiting..."); 
        try { 
         socket = serverSocket.accept(); 
         System.out.println("Accepted connection : " + socket); 
         int bytesRead; 
         int current = 0; 
         byte[] mybytearray = new byte[FILE_SIZE]; 
         InputStream is = socket.getInputStream(); 
         fileOutputStream = new FileOutputStream(FILE_TO_RECEIVED); 
         bufferedOutputStream = new BufferedOutputStream(bufferedOutputStream); 
         bytesRead = is.read(mybytearray, 0, mybytearray.length); 
         current = bytesRead; 

         do { 
          bytesRead = 
            is.read(mybytearray, current, (mybytearray.length - current)); 
          if (bytesRead >= 0) current += bytesRead; 
         } while (bytesRead > -1); 

         bufferedOutputStream.write(mybytearray, 0, current); 
         bufferedOutputStream.flush(); 
         System.out.println("File " + FILE_TO_RECEIVED 
           + " recieved (" + current + " bytes read)"); 


        } finally { 
         if (fileOutputStream != null) fileOutputStream.close(); 
         if (bufferedOutputStream != null) bufferedOutputStream.close(); 
         if (socket != null) socket.close(); 
        } 
       } 
      } finally { 
       if (serverSocket != null) serverSocket.close(); 
      } 
     } 

答えて

1

ですルーキーでの回答で説明どおり

while ((bytesRead = in.read(mybytearray)) > 0) { 
    fileOutputStream.write(mybytearray, 0, bytesRead); 
} 

にあなたのwhileループを変更する - あなたはFILE_SIZEという名前の変数を持っているので https://stackoverflow.com/a/9548429/2826895

+0

のように何のバイトが読み込まれていない場合に停止することは非常に低速な接続 –

+0

@ThijsSteelに問題がある可能性があります:読み取りゼロを返すことはありません、それが読むことを頼まれた場合を除き接続がどれほど遅い場合でもゼロバイト。 –

+0

@JamesKPolkあなたは正しいよ –

1

、私はあなたがあなたのファイルのサイズを知っていると仮定します。代わりにあなたがデータ取得を停止するまで、ストリームからの読み込みの

while (bytesRead > -1 && current<FILE_SIZE)

あなたはいつものサイズがわからない場合:while (bytesRead > -1)を、あなたが任意のより多くのデータを期待していない時に停止しようとする場合がありますそのサイズのソケットを介して通信する必要があります。これは単純にファイルサイズを表す整数でもかまいませんが、HTTPで使用されるチャンクエンコーディングのようなものでもかまいません。

+0

これはうまくいくだろうが、私は少し異なる答えを書いた。 –

0

問題は、ユーザータイススチールでほのめかしとして、次の2行である:

bytesRead = is.read(mybytearray, current, (mybytearray.length - current)); 
if (bytesRead >= 0) current += bytesRead; 

すぐに最後のバイトを読むとした後、現在は(FILE_SIZEが実際の大きさであると仮定するとmybytearray.lengthに等しくなりますバイト単位のファイル)。それ以降、無限ループがあり、ゼロバイトを読み込むように要求します。これは、忠実に読み取り、ゼロを返します。

ループ終了条件は、ファイルの終わり(EOF)またはFILE_SIZEバイトの読み取り後になるようにしますが、両方ではありません。

EOFを停止条件として使用するには、読み込みループを固定長のバイトバッファを使用するように変更する必要があります。 FILE_SIZEを停止条件として使用する方がはるかに簡単です。あなたは、単にDataInputStreamにInputStreamをラップし、readFully()方法を使用し、

DataInputStream dis = new DataInputStream(is); 
dis.readFully(mybytearray); 
+0

なぜ両方ですか?ループ停止条件がEOF(私たちが今持っているもの)であれば、無限ループになります。ループ停止条件がFILE_SIZEバイトを読み取っている場合、ネットワーク状態の場合には停止しません。 –

+0

@ThijsSteel:答えを明確にする必要があります。 –

+0

'FILE_SIZE'は定数です。それはコードのどこにも言及されていませんでした。大文字から引用すれば、定数であると見なすことができます。 – RealSkeptic