Search code examples
javasocketsbufferedreaderjava1.4printwriter

How do you set a timeout on BufferedReader and PrintWriter in Java 1.4?


How does one set a timeout on a BufferedReader and a PrintWriter created using a socket connection? Here is the code I have for the server right now, which works until either the server or the client crashes:

while(isReceiving){
    str = null;
    BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);

    while ((str = br.readLine()) != null){
        System.out.println("Processing command " + str);
        pw.println(client.message(str));
    }
}

Outside the scope of this code I have imposed a socket timeout of 1000ms, which works as intended when waiting for the initial connection. But the program blocks at (str = br.readLine()). If the client hangs or crashes, it never stops blocking unless I terminate the process (which even then doesn't always work).

The client code in question is very similar to this, and is blocking in a similar fashion.


Solution

  • Since calling socket.close() did not seem to interrupt the block at br.readLine(), I did a little workaround. When disconnecting the client from the server, I merely send through a string "bye", and told the server to close the socket connection when it receives this command.

    while ((str = br.readLine()) != null){
        // If we receive a command of "bye" the RemoteControl is instructing
        // the RemoteReceiver to close the connection.
        if (str.equalsIgnoreCase("bye")){
            socket.close();
                break;
        }
        System.out.println("Processing command " + str);
        pw.println(client.message(str));
    }