Java NIO. SocketChannel.read method all time return 0. Why?

user471011 picture user471011 · Jul 12, 2012 · Viewed 11.7k times · Source

I try understand how works java NIO. In particular, how works SocketChannel.

I wrote code below:

import java.io.*;
import java.net.*;
import java.nio.*;
import java.nio.channels.*;

public class Test {

    public static void main(String[] args) throws IOException {

        SocketChannel socketChannel = SocketChannel.open();
        socketChannel.configureBlocking(false);
        socketChannel.connect(new InetSocketAddress("google.com", 80));

        while (!socketChannel.finishConnect()) {
            // wait, or do something else...
        }

        String newData = "Some String...";

        ByteBuffer buf = ByteBuffer.allocate(48);
        buf.clear();
        buf.put(newData.getBytes());

        buf.flip();

        while (buf.hasRemaining()) {
            System.out.println(socketChannel.write(buf));
        }

        buf.clear().flip();

        int bytesRead;

        while ((bytesRead = socketChannel.read(buf)) != -1) {

            System.out.println(bytesRead);

        }

    }

}
  1. I try connect to google server.
  2. Send request to the server;
  3. Read answer from the server.

but, method socketChannel.read(buf) all time return 0 and performs infinitely.

Where I made mistake??

Answer

Ramesh PVK picture Ramesh PVK · Jul 12, 2012

Because NIO SocektChannel will not block until the data is available for read. i.e, Non Blocking Channel can return 0 on read() operation.

That is why while using NIO you should be using java.nio.channels.Selector which gives you read notification on channel if the data is available.

On the otherhand, blocking channel will wait till the data is available and return how much data is available. i.e, Blocking channel will never return 0 on read() operation.

You can read more about NIO here: