0

バイト数を定義せずに SocketChannel でストリームを読み取ろうとしています。

私が考えた別の解決策は、事前定義されたサイズの異なる ByteBuffers をリストに格納することです。これにより、後で受信したサイズの新しい ByteBuffer を割り当てて、結果を中に入れることができます。

問題は、私がブロッキングモードにあり、読み取りメソッドで作成したループを終了する有効な条件が見つからないことです。コードを確認してください:

public static final Charset charsetUTF8 = Charset.forName("UTF-8");
public static final int BUFFER_SIZE = 1024;

public static String getUnbounded(String st, SocketAddress address) throws IOException {
    SocketChannel sc = SocketChannel.open(address);
    sc.write(charsetUTF8.encode(st));
    List<ByteBuffer> listBuffers = new ArrayList<>();
    ByteBuffer buff = ByteBuffer.allocate(BUFFER_SIZE);
    while( sc.read(buff) > -1){
        if(buff.remaining() == 0){
            listBuffers.add(buff);  
            buff.clear();
        }
    }

    listBuffers.add(buff);
    ByteBuffer finalBuffer = ByteBuffer.allocate(BUFFER_SIZE * listBuffers.size());
    for(ByteBuffer tempBuff: listBuffers){
    finalBuffer.put(tempBuff);
        tempBuff.clear();
    }
    finalBuffer.flip();

    return charsetUTF8.decode(finalBuffer).toString();
}

これを解決する方法について何か考えはありますか?

4

3 に答える 3

2

clear()バイトバッファだけではできません。新しいものを割り当てる必要があります。そうしないと、同じバッファーがlistBuffers繰り返し追加されます。

ByteBuffer buff = ByteBuffer.allocate(BUFFER_SIZE);
while( sc.read(buff) > -1){
    if(buff.remaining() == 0){
        listBuffers.add(buff);  
        buff = ByteBuffer.allocate(BUFFER_SIZE);
    }
}
if (buff.position() > 0) {
    listBuffers.add(buff);
}

最後のバッファはいっぱいにならない (おそらくいっぱいにならない) 可能性があるため、finalBufferこれを考慮してサイズを計算する必要があります。

于 2014-03-12T23:52:16.633 に答える
0

HTTP 応答ストリームのバイト数は「未定義」ではありません。RFCを参照してください。次のいずれかで定義されます。

  1. クローズされた接続の場合の EOS (HTTP 1.0 または Connection: close)、
  2. Content-Length ヘッダー、または
  3. チャンク エンコード形式をデコードした結果。

これらの方法のいずれかで定義することが不可欠であり、おそらく他の方法もあり、HTTP 永続接続が機能し、この後に別の応答がある可能性があります。

HttpURLConnectionクラスが既に存在するのに、これをすべて正しく実装しているさまざまなサードパーティの HTTP クライアントと一緒に、なぜこれを実装しているのかを知りたいです。

于 2014-03-12T23:53:10.157 に答える
-1

解決策は、私が呼び出さなければならなかったループから抜け出すことです:

sc.shutdownOutput();

読み取りストリームを閉じずに書き込みストリームを閉じ、 sc.read(buff) を -1 に設定します

于 2014-03-13T21:00:32.747 に答える