¿Cómo se establece un tiempo de espera en BufferedReader y PrintWriter en Java 1.4?

¿Cómo se establece un tiempo de espera en un BufferedReader y un PrintWriter creado usando una conexión de socket? Aquí está el código que tengo para el servidor en este momento, que funciona hasta que el servidor o el cliente se bloquean:

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));
    }
}

Fuera del alcance de este código, he impuesto un tiempo de espera de socket de 1000 ms, que funciona según lo previsto al esperar la conexión inicial. Pero el programa se bloquea en (str = br.readLine ()). Si el cliente se cuelga o falla, nunca deja de bloquear a menos que finalice el proceso (que incluso entonces no siempre funciona).

El código del cliente en cuestión es muy similar a este y se bloquea de manera similar.

Respuestas a la pregunta(4)

Su respuesta a la pregunta