STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
1. Run the enclosed source code in DOS box.
2. From DOS, run "telnet localhost 10064"
3. The source will issue of unending "write at **ticks**"
4. run the code with java nio_test reset to unregister OP_WRITE
EXPECTED VERSUS ACTUAL BEHAVIOR :
I would expect that I get one isWritable keys until I
actually write something.
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
import java.nio.channels.*;
import java.net.*;
import java.util.*;
public class nio_test
{
public static void main(String[] args) throws Exception
{
System.out.println("Java Version: " + System.getProperty
("java.vm.version", "???"));
boolean reset = (args.length > 0);
Selector selector = Selector.open();
ServerSocketChannel server = ServerSocketChannel.open();
server.configureBlocking(false);
InetSocketAddress address = new InetSocketAddress(10064);
server.socket().bind(address);
server.register(selector, SelectionKey.OP_ACCEPT);
SocketChannel socket = null;
for(;

{
if ( selector.select() > 0 )
{
Set keys = selector.selectedKeys();
Iterator iterator = keys.iterator();
while ( iterator.hasNext() )
{
SelectionKey key = (SelectionKey)iterator.next();
iterator.remove();
if ( key.isAcceptable() )
{
System.out.println("accept at " + System.currentTimeMillis());
socket = server.accept();
socket.configureBlocking(false);
socket.socket().setTcpNoDelay(false);
socket.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE);
}
else
{
if ( key.isWritable() )
{
System.out.println("write at " + System.currentTimeMillis());
if (socket != null && reset) {
socket.register(selector, SelectionKey.OP_READ);
}
}
else if ( key.isReadable() )
{
System.out.println("read at " + System.currentTimeMillis());
}
}
}
}
}
}
}
---------- END SOURCE ----------
CUSTOMER WORKAROUND :
Don't use OP_WRITE
(Review ID: 163452)
================================================== ====================