JDK-4663867 : channel.socket().getInputStream().available() returns 0
  • Type: Bug
  • Component: core-libs
  • Sub-Component: java.nio
  • Affected Version: 1.4.0
  • Priority: P4
  • Status: Closed
  • Resolution: Duplicate
  • OS: solaris_7
  • CPU: x86
  • Submitted: 2002-04-05
  • Updated: 2002-04-09
  • Resolved: 2002-04-09
Related Reports
Duplicate :  
Description

Name: gm110360			Date: 04/05/2002


FULL PRODUCT VERSION :
java version "1.4.0"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0-b92)
Java HotSpot(TM) Client VM (build 1.4.0-b92, mixed mode)


FULL OPERATING SYSTEM VERSION :
SunOS jersy5 5.7
Generic_106542-19 i86pc i386 i86pc


A DESCRIPTION OF THE PROBLEM :
The SocketChannel is registered as:

channel.register(selector, SelectionKey.OP_READ);

When SelectionKey for that channel indicates that channel
is ready for reading ( key.isReadable() returns true),
call to
channel.socket().getInputStream().available() returns 0.


EXPECTED VERSUS ACTUAL BEHAVIOR :
The call to:
channel.socket().getInputStream().available()
should return number of bytes available in the InputStream.

This bug can be reproduced always.

---------- BEGIN SOURCE ----------
import java.io.*;
import java.nio.*;
import java.nio.channels.*;
import java.net.*;
import java.util.*;


public class AvailableBytesTest implements Runnable {

  int port = 9999;
  Selector selector;
  InetSocketAddress isa;

  public AvailableBytesTest() throws IOException {
    ServerSocketChannel channel = ServerSocketChannel.open();
    channel.configureBlocking(false);
    InetAddress ia = InetAddress.getLocalHost();
    isa = new InetSocketAddress(ia, port);
    channel.socket().bind(isa);

    selector = Selector.open();
    channel.register(selector, SelectionKey.OP_ACCEPT);
  }
  
  public void run() {
    SocketChannel channel = null;
    try {
      channel = SocketChannel.open();
      channel.connect(isa);
      byte[] data = new byte[64];
      ByteBuffer buf = ByteBuffer.wrap(data);
      channel.write(buf);
    } catch(IOException e) {
      e.printStackTrace();
    }
    try {
      Thread.sleep(1000);
      selector.wakeup();
      Thread.sleep(1000);
      channel.close();
    } catch(Exception e) {
      e.printStackTrace();
    }
  }

  public void exec() throws IOException {
    new Thread(this).start();
    ByteBuffer buf = ByteBuffer.allocate(64);
    for (;;) {
      System.out.println("Waiting...");
      if ( selector.select() == 0 ) {
        System.out.println("Exiting...");
	break;
      }
      System.out.println("Working...");
      Iterator it = selector.selectedKeys().iterator();

      while (it.hasNext()) {
        SelectionKey key = (SelectionKey) it.next();
	it.remove();

	if (key.isAcceptable()) {
	  System.out.println("Got acceptable key.");
	  ServerSocketChannel ssc = (ServerSocketChannel) key.channel();

	  SocketChannel channel = (SocketChannel) ssc.accept();
	  channel.configureBlocking(false);
	  channel.register(selector, SelectionKey.OP_READ);
	}
	if (key.isReadable()) {
	  System.out.println("Got readable key.");
	  SocketChannel channel = (SocketChannel) key.channel();

	  int num = channel.socket().getInputStream().available();
	  System.out.println("Number of available bytes: " + num);

          num = channel.read(buf);
          System.out.println("Number of bytes read: " + num);
	}
      }
    }
  }

  public static void main( String[] args ) {
    try {
      new AvailableBytesTest().exec();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

---------- END SOURCE ----------
(Review ID: 145070) 
======================================================================