Scanner.nextLine () se bloquea al usar InputStream desde Socket

Cuando recibo datos usandoSocket.getInputStream() directamente (sin algún tipo de interfaz como Scanner), no se bloquea. Pero cuando trato de usar un escáner (similar a cómo recibimos cadenas deSystem.in), lo hace. Me preguntaba la razón de esto, y cómo el InputStream que le suministra un Socket conectado es diferente delInputStream in enSystem.

El cliente utilizado para las pruebas (utilizado para ambos servidores)

El código que cuelga:

public class Server {

    public static void main(String[] args) {
        try {
            ServerSocket ss = new ServerSocket(15180);
            Socket socket = ss.accept();

            Scanner scanner = new Scanner(socket.getInputStream());
            //read data from client
            while(true) {
                String data = scanner.nextLine();
                System.out.println("Received data!");
            }

        }catch(IOException e) {
            e.printStackTrace();
        }
    }
}

El código que no bloquea:

public class Server {
    public static void main(String[] args) {
        try {
            ServerSocket ss = new ServerSocket(15180);
            Socket socket = ss.accept();

            //read data from client
            while(true) {
                int data = socket.getInputStream().read();
                System.out.println("Received data!");
            }

        }catch(IOException e) {
            e.printStackTrace();
        }
    }
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta