1

これは、問題が発生しているコードスニペットです。

public static byte[] copyLargeExt(InputStream input) throws IOException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024*8];
        int n = 0;
        while(-1 != (n = input.read(buffer))) {
            baos.write(buffer, 0, n);
        // i just append this pattern ({###END###}) to force the break  
           /*if(baos.toString(UTF8.name()).endsWith("{###END###}")) {
                break;
            }*/
        }
        return baos.toByteArray();
    }

誰かが私を助けることができますか?

4

2 に答える 2

2

ジャワで。
サーバーのみが最初にSocket.close()ない場合OutputStream.close()、クライアントInputStream.read()は を返しません-1
代わりに、クライアントInputStream.read()はタイムアウトになるまでブロックします。したがって、サーバーでのベスト プラクティスは次のとおりです。

OutputStream.close();
InputStream.close();
Socket.close();
于 2016-08-10T11:56:29.430 に答える
2

問題のコードは、ソケット ストリームの最後まで読み取ります。メソッドがブロックされていて読み取り呼び出しにある場合、それは、もう一方の端が対応する出力ストリームをまだ閉じていないことを意味するだけです。

次の 2 つの選択肢があります。

  • もう一方の端を変更して出力ストリームを閉じ、このコードが EOF を認識できるようにします。

  • 「プロトコル」を変更して、このコードが期待するデータのバイト数を認識し、正確にそのバイト数を読み取るようにします。

于 2012-11-08T11:35:31.140 に答える