Problema com BufferedInputStream

Galera estou com um problema onde o valor recebido não contém um valor -1 que seria o fim dos Bytes. E isso faz com que o while pare e fique esperando algo. Alguém poderia dar uma luz?
Se eu usar um “for” com tamanho determinado funciona, mas não resolve meu problema. Preciso do while pq não posso saber o que vem do outro lado.

package socket;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
 *
 * @author Adaylon
 */
public class StartServer implements Runnable{
    public static void main(String args[]){
        StartServer se = new StartServer();
        se.sta();
    }

    public void sta(){
        new Thread(this).start();
    }

    public void run() {
        System.out.println("Servidor inicializado...");
        try {
            ServerSocket server = new ServerSocket(4444);
            Socket clientSocket = null;
            for(;;){
                    System.out.println("Aguardando conexões");
                    clientSocket = server.accept();
                    System.out.println("Conectado na porta: " + clientSocket.getPort());
                    new Server(clientSocket).start();
            }
        } catch (IOException ex) {
            Logger.getLogger(StartServer.class.getName()).log(Level.SEVERE, null, ex);
        }
   }
}

*****************************************************************************

package socket;
/**
 *
 * @author Adaylon
 */
import java.io.*;
import java.net.*;

public class Server extends Thread{

   private static String HELLO = "Hello Conectta Softwares";
   private Socket clientSocket = null;

   public Server(Socket so){
       clientSocket = so;
   }

   @Override
   public void run() {
          try {
             byte[] bt = new byte[1024];
             byte[] read = new byte[1024];
             String ts = "teste";
             BufferedInputStream in = new BufferedInputStream(clientSocket.getInputStream());
             BufferedOutputStream out = new BufferedOutputStream(clientSocket.getOutputStream());
             InputStreamReader isr = new InputStreamReader(in, "ISO-8859-1");
             StringBuffer buf = new StringBuffer();

             bt = ts.getBytes();
             int ch;
             while((ch = isr.read()) != -1){ //O problema está aqui. Se eu colocar um "for" com tamanho determinado funciona.
                buf.append((char)ch);
             }
             
             System.out.println(buf.toString());

             out.write(bt,0,ts.length());
             out.flush();

             out.close();
             in.close();
             out = null;
             in = null;
             clientSocket.close();
          }
          catch(Exception e) {
             System.out.print(e.getMessage().toString());
          }
   }
}

**************************************************************************************

package socket;
/**
 *
 * @author Adaylon
 */
import java.io.*;
import java.net.*;

class Client {
   public static void main(String args[]) {
      try {
         byte[] bt = new byte[1024];
         String ts = "teste";
         Socket skt = new Socket("localhost", 4444);
         BufferedInputStream in = new BufferedInputStream(skt.getInputStream());
         BufferedOutputStream out = new BufferedOutputStream(skt.getOutputStream());
         InputStreamReader isr = new InputStreamReader(in, "ISO-8859-1");

         StringBuffer buf = new StringBuffer();

         bt = ts.getBytes();
         out.write(bt, 0, ts.length());
         out.flush();

         int ch;
         while((ch = isr.read()) != -1){ //O problema está aqui. Se eu colocar um "for" com tamanho determinado funciona.
            buf.append((char)in.read());
         }

         System.out.println(buf.toString());

         in.close();
         out.close();
      }
      catch(Exception e) {
         System.out.print(e.getMessage());
      }
   }
}