Bardzo prosty problem: Czytam z jednego SocketChannel i chciałbym zapisać wyniki w innym SocketChannel. Używam obiektu Selector, więc czekam, aż jeden SocketChannel będzie czytelny, zrzuci dane do ByteBuffer, a kiedy następny SocketChannel będzie zapisywalny, zrzucę tam ByteBuffer. OK do tej pory. Jednak wydaje się, że nie ma sposobu, aby "wyczyścić" ByteBuffer, więc nie mogę sprawdzić, kiedy nadejdą nowe dane.Czyszczenie ByteBuffer
Próbowałem metody .clear(), ale to najwyraźniej nie czyści bufor, ale po prostu resetuje pozycję bufora na 1.
Nigdy programu w Javie więc urodziła się ze mną, jeśli jest to problem z roztworem "oczywiste" ...
Oto niektóre przykładowy kod:
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... */
}
Dzięki!
należy użyć 'ByteBuffer' jako załącznik podczas rejestracji kanału do selektora (trzeci parametr metody regsiter), w ten sposób można pobrać załącznik z' SelectionKey' i uniknąć wszystkich zagnieżdżonych jeśli klauzul . – mike