2012-02-29 9 views
5

非常に単純な問題:私は1つのSocketChannelから読み込み、別のSocketChannelに結果を書きたいと思います。 Selectorオブジェクトを使用しているので、1つのSocketChannelが読み込み可能になるまで待機し、ByteBufferにデータをダンプし、次のSocketChannelが書き込み可能になると、そこにByteBufferをダンプします。これまでOK。しかし、ByteBufferを実際にクリアする方法はないので、新しいデータがいつ到着したかを知るためのチェックを行うことはできません。ByteBufferのクリア

私は.clear()メソッドを試してみたが、それは明らかにバッファをクリアしませんが、これがあればちょうど私と一緒にその裸Javaで私は決してプログラム1.

にバッファ位置をリセット

ByteBuffer channel1buf = ByteBuffer.allocate(1024); 
ByteBuffer channel2buf = ByteBuffer.allocate(1024); 

if (key.isReadable()) { 
    if (key.channel().equals(channel1)) { 
     channel1.read(channel2buf); 
    } else if (key.channel().equals(channel2)) { 
     channel2.read(channel1buf); 
    } 
} else if (key.isWritable()) { 
    if (key.channel().equals(channel1) && channel1buf.asCharBuffer().length() > 0) { 
     channel1.write(channel1buf); 
     /* some way to clear channel1buf */ 
    } else /* same idea for channel2... */ 
} 

ありがとう: "明白な" 解決策の問題...

はここにいくつかのサンプルコードです!

+0

。 – mike

答えて

4

Buffer.clearは、yesをリセットしてから、getPosition() > 0を使用して、後でバッファに何かが追加されたかどうかを確認できます。

+0

_almost_は動作しますが、バッファには古いデータが残っているため、オーバーフローが発生します。私はバッファを通過して手作業でそれを掃除することができると思うが、それはあまりにもエレガントではないようだ。 – user1241397

+0

要点は、バッファに古いデータがまだ残っているのはなぜですか?それをクリアすると、GCは何もさせません。 'getPosition()'の下にあるものは見ないでください。あなたはうまくいくはずです...または何かが欠けていますか? –

+0

バッファーは固定サイズなので、バッファー内のスペースが不足してしまいます。 – user1241397

4

私はこのコードで同じ問題を解決しました。それがあなたを助けることを願っています。あなたは、セレクタ(regsiter方法の第3パラメータ)にチャンネルを登録している間、その方法は、あなたが `SelectionKey`から添付ファイルを取得し、すべての場合はネストされた条項を回避することができます添付ファイルとして` ByteBuffer`を使用する必要があります

channel1buf.clear(); 
//zerolize buff manually 
channel1buf.put(new byte[1024]); 
channel1buf.clear(); 
+1

または 'Arrays.fill(channel1buf、(byte)0);あなたが 'ByteBuffer'クラスを使用しようとしているような方法であれば、' flip() 'を呼び出す前にバッファの' ZeroMemory() 'を呼び出す必要はありません。channel0buf.clear();' –

+1

再読み込みの前に 'rewind()'、書き込みの前に 'clear()'や 'compact()'を使います。 – Lumi

関連する問題