2012-04-24 40 views
1

ここに私が今いるものがあります。ストリーム経由でファイルを送信する

受信機:

public static void read(Socket socket, ObjectInputStream in) { 
    try { 
     String separator = in.readUTF(); 
     while (in.readByte() == -3) { 
      String path = in.readUTF().replaceAll(separator, System.getProperty("file.separator")); 
      File file = new File(new File(path).getParent()); 
      if (!file.exists()) { 
       file.mkdirs(); 
      } 
      FileOutputStream fos = new FileOutputStream(path); 
      int b = 0; 
      while ((b = in.readByte()) != -4) { 
       fos.write(b); 
      } 
      fos.close(); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

送信者:

public static void send(String[] path) { 
    Socket socket; 
    try { 
     socket = new Socket(ip, port); 
     socket.setKeepAlive(true); 
    } catch (UnknownHostException e) { 
     return; 
    } catch (IOException e) { 
     return; 
    } 
    try { 
     ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream()); 
     out.writeUTF(Devbox.getSeparator()); 
     for (String s : path) { 
      send(s, out); 
      out.writeByte(-2); 
     } 
     out.close(); 
     socket.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

private static void send(String path, ObjectOutputStream out) { 
    File file = new File(path); 
    if (file.isDirectory()) { 
     File[] files = file.listFiles(); 
     for (File f : files) { 
      send(path + f.getName(), out); 
     } 
    } else { 
     try { 
      out.writeByte(-3); 
      out.writeUTF(path); 
      FileInputStream fis = new FileInputStream(file); 
      int b = 0; 
      while ((b = fis.read()) != -1) { 
       out.writeByte(b); 
      } 
      fis.close(); 
      out.writeByte(-4); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

これは私が送信者に取得エラーです。

java.net.SocketException: Software caused connection abort: socket write error 
    at java.net.SocketOutputStream.socketWrite0(Native Method) 
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109) 
    at java.net.SocketOutputStream.write(SocketOutputStream.java:153) 
    at java.io.ObjectOutputStream$BlockDataOutputStream.writeBlockHeader(ObjectOutputStream.java:1874) 
    at java.io.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.java:1855) 
    at java.io.ObjectOutputStream$BlockDataOutputStream.writeByte(ObjectOutputStream.java:1895) 
    at java.io.ObjectOutputStream.writeByte(ObjectOutputStream.java:760) 

それは、このエラーをスローし、その後、成功した約25のファイルを送信し

   out.writeByte(b); 

を指します。それをスローするファイルは毎回異なりますが、約5つのファイルと同じ範囲にあります。受信者は、送信者が停止しているファイルの前に通常はカップルである特定のファイルの後に停止します。 in.readByte()== -3はfalseであるため停止します。それが起こったとき、私は-85と16のような数字を得ました。私は別のコンピュータでそれを試しました。なぜなら、ソフトウェアについて何か言っていたからです。誰がなぜこれが起こっているのか知っていますか?私は一日それを把握しようと過ごして、どこにも得られませんでした。どんな助けでも大歓迎です。

+0

入力ファイルに-4の値が含まれていないことを保証できますか?それ以外の場合は、送信側がまだストリームにデータを書き込んでいる間に、受信側は出力ファイルへのバイトの書き込みを停止します(接続を閉じることもできます)。 –

+0

@AndreHolznerはい、私はそれが問題ではないことを保証することができます。 – Stripies

答えて

0

このanswerをお読みください、私は何か他のものでも、私は接続を閉じますあなたのコードには何も表示されない、それを超えて言うことができるとは思いません。 OTN議論から

のWinSock説明:ローカル・ネットワーク・システム が接続を中止したときにエラーが発生することができます。これは、データ再送信が失敗した後に確立された 接続をWinSockが中止した場合に発生します(受信者は決して がデータストリームソケットで送信されたことを確認します)。

TCP/IPシナリオ:送信されたデータに対してローカルシステムが (ACK)nowledgementを受信しない場合、接続はタイムアウトします。 (FIN)ish TCPパケットがACKでない場合(FINがACKであっても、FINが返されない場合には は最終的にタイムアウトになります)、タイムアウトになります。

WindowsXPでもっと起こりそうですが、おそらくWindowsファイアウォールの設定に関連する と思われます。どんな場合でも、顕著な ポイントは、アボートがローカルマシン内で発生したことです。

+0

この場合、修正する方法はありますか? – Stripies

0

BufferedInputStreamを使用して、sendメソッドのFileInputStreamを読み取ります。

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file)); 
while ((b = bis.read()) != -1) { 
    out.writeByte(b); 
} 

もまた

BufferedInputStream bos = new FileOutputStream(path); 
int b = 0; 
while ((b = in.readByte()) != -4) { 
    bos.write(b); 
} 

補完的なBufferedOutputStreamを試してみてください、あなたはファイルが転送を終了すると、あなたの接続を洗い流す必要があります。

out.flush; 
+0

それは同じことをするが、助けにならなかった。 – Stripies

+0

受信側のreadメソッドで補完するBufferedOutputStreamが必要な場合があります。 – eabraham

関連する問題