これらのストリームをすべて閉じる必要はありません。それはおそらくあなたが破損したパイプの問題を見ている理由です。入力ストリームと出力ストリームを閉じるだけです。 DIN/dout.close()が呼び出されたときに、あなたのバッファ*ストリームとソケットのInputStreamを/ OUTSTREAMが閉じられますので
DataInputStream din = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
DataOutputStream dout = new DateOutputStream(new BufferedOutputStream(socket.getOutputStream());
try {
} finally {
din.close();
dout.close();
}
あなたがそれらのストリームのすべてを閉じる必要はありません理由があります。それらは連鎖している参照を介してストリームを閉じます。もしあなたがfinally節にそれを作るなら、それらがnullではないことを知っているので、それらのそれぞれのif(blah!= null)junkを取り除くこともできます。試しに新しいことがなければ、それは事実です。
また、2番目の新しいFileOutputStream()でfos変数を上書きしたため、FileOutputStreamもリークしています。あなたはSUBMIT_DONEファイルで何をしていますか?それは本当に奇妙です。それを行うことはかなり悪い考えです。そのような変数参照を2回使用しないでください。私はおそらくあなたのループの後に最初のファイルを閉じるだろう。 try {} finally {fos.close();でループをラップすることを考えてください。 }。
そして、これを少し壊す方法を試してみてください。静的に捨てなさい。
アップデート:以下やっているまさにあなたはどう思いますか
?
String userName = din.readUTF();
はあなたがフォーマットされたバイナリデータを処理しているのDataInputStreamを覚えている:あなたは、単に使用することができ、あなたのクライアントやサーバーからのデータを送信する方法に応じて
while(c!='\0') {
userName += c;
c = din.readChar();
}
。また、正確なループコードがファイル名のために繰り返されます。 readUTF()を使用できない場合は、そのループをラップして文字列を返し、その2つの場所から呼び出すメソッドを作成します。あなたは、クライアントが生のファイル名とファイルをあなたにアップロードできるように、あらゆる種類のセキュリティ問題があります。私はあなたが構築しているこのサーバーは、生産に展開されていない甘い赤ちゃんjeezに願っています。
ソケットを介して受け取った各ファイルをフラッシュして閉じる必要があります。そのため、送信されたデータの全量がファイルに完全に書き込まれます。
あなたのコードを実行した後も、私はまだパイプが破損しています。問題が何であるかわからない –
コードで例外が発生している場所に沿って変更されたコードを再ポストする必要があるかもしれません。例外をチェックすると、例外が発生したファイル内の行番号が表示されます。例外を理解することに問題がある場合は、完全な例外を投稿し、私はそれを指摘することができます。コメントに十分なスペースがないため、元の質問を更新してください。 – chubbsondubs
私はそれを修正し、あなたの助けに感謝します! –