Cześć, robię przykład z książki Marcina Lisa "Java ćwiczenia zaawansowane". Jestem w trakcie przerabiania 4 tematu i napotkałem błąd. Zagadnieniem tematu 4 jest komunikacja klient serwer. Po pierwsze w kodzie w książce jest napisane

//pętla główna klienta
while(true){
try{
line = brLocalInp.readLine();
if(line != null){
System.out.println("Wysyłam: " + line);
out.writeBytes(line + '\n');
out.flush();
}
if(line == null || "quit".equals(line)){
System.out.println("Kończenie pracy...");
clientSocket.close();
System.exit(0);
}
line = brSockInp.readLine();
System.out.println("Otrzymano: " + line);
}

Sory za wcięcia ale kopiowane z pdfa. Chodzi mi konkretnie o ten kawałek

line = brSockInp.readLine();
System.out.println("Otrzymano: " + line);

W kodzie który możemy pobrać z ftp z heliona jest tak

brSockInp.readLine();
System.out.println("Otrzymano: " + line);

Przez co wydaje się teoretycznie, że program działa bo wyświetla line odczytaną wcześniej. Po zmianie na wersję z książki output z klienta wygląda następująco

Połączono z Socket[addr=localhost/127.0.0.1,port=6666,localport=55877]
hej
Wysyłam: hej
Otrzymano: hej
elo
Wysyłam: elo
Otrzymano: 
test
Wysyłam: test
Otrzymano: elo
test2
Wysyłam: test2
Otrzymano: 

Nie bardzo mogę wpaść na to jak poprawić ten błąd.
Wszystkie klasy wyglądają tak

import java.net.*;
import java.io.*;

public class EchoServer
{
  public static void main(String args[])
  {
    ServerSocket serverSocket = null;
    Socket socket = null;
    try{
      serverSocket = new ServerSocket(6666);
    }
    catch(IOException e){
      System.out.println(
              "Błąd przy tworzeniu gniazda serwerowego " + e);
      System.exit(-1);
    }
    System.out.println("Inicjalizacja gniazda zakończona...");
    System.out.println("Parametry gniazda: " + serverSocket);
    while(true){
      try{
        socket = serverSocket.accept();
      }
      catch(IOException e){
        System.out.println("Błąd wejścia-wyjścia: " + e);
      }
      System.out.println("Nadeszło połączenie...");
      System.out.println("Parametry połączenia: " + socket);
      new Thread(new EchoServerThread(socket)).start();
    }
  }
}
import java.net.*;
import java.io.*;

public class EchoServerThread implements Runnable
{
  protected Socket socket;
  public EchoServerThread(Socket clientSocket)
  {
    this.socket = clientSocket;
  }
  public void run()
  {
    //Deklaracje zmiennych
    BufferedReader brinp = null;
    DataOutputStream out = null;
    String threadName = Thread.currentThread().getName();

    //inicjalizacja strumieni
    try{
      brinp = new BufferedReader(
              new InputStreamReader(
                      socket.getInputStream()
              )
      );
      out = new DataOutputStream(socket.getOutputStream());
    }
    catch(IOException e){
      System.out.println(threadName + "| Błąd przy tworzeniu strumieni " + e);
      return;
    }
    String line = null;

    //pętla główna
    while(true){
      try{
        line = brinp.readLine();
        System.out.println(threadName + "| Odczytano linię: " + line);

        //badanie warunku zakończenia pracy
        if((line == null) || "quit".equals(line)){
          System.out.println(threadName + "| Zakończenie pracy z klientem: " + socket);
          socket.close();
          return;
        }
        else{ //odesłanie danych do klienta
          out.writeBytes(line + "\n\r");
          System.out.println(threadName + "| Wysłano linię: " + line);
        }
      }
      catch(IOException e){
        System.out.println(threadName + "| Błąd wejścia-wyjścia." + e);
        return;
      }
    }
  }
}
import java.net.*;
import java.io.*;

public class Client
{
    public static void main(String args[])
    {
        String host = "localhost";
        int port = 6666;
        //Inicjalizacja gniazda klienckiego
        Socket clientSocket = null;
        try{
            clientSocket = new Socket(host, port);
        }
        catch(UnknownHostException e){
            System.out.println("Nieznany host.");
            System.exit(-1);
        }
        catch(ConnectException e){
            System.out.println("Połączenie odrzucone.");
            System.exit(-1);
        }
        catch(IOException e){
            System.out.println("Błąd wejścia-wyjścia: " + e);
            System.exit(-1);
        }
        System.out.println("Połączono z " + clientSocket);

        //Deklaracje zmiennych strumieniowych
        String line = null;
        BufferedReader brSockInp = null;
        BufferedReader brLocalInp = null;
        DataOutputStream out = null;

        //Utworzenie strumieni
        try{
            out = new DataOutputStream(clientSocket.getOutputStream());
            brSockInp = new BufferedReader(
                    new InputStreamReader(
                            clientSocket.getInputStream()));
            brLocalInp = new BufferedReader(
                    new InputStreamReader(System.in));
        }
        catch(IOException e){
            System.out.println("Błąd przy tworzeniu strumieni: " + e);
            System.exit(-1);
        }
        //Pętla główna klienta
        while(true){
            try{
                line = brLocalInp.readLine();
                if(line != null){
                    System.out.println("Wysyłam: " + line);
                    out.writeBytes(line + '\n');
                    out.flush();
                }
                if(line == null || "quit".equals(line)){
                    System.out.println("Kończenie pracy...");
                    clientSocket.close();
                    System.exit(0);
                }
                line = brSockInp.readLine();
                System.out.println("Otrzymano: " + line);
            }
            catch(IOException e){
                System.out.println("Błąd wejścia-wyjścia: " + e);
                System.exit(-1);
            }
        }
    }
}

Edit:
Gdy łączę się poprzez telnet wszystko wygląda okej po stronie serwera, więc myślę że problem leży po stronie klienta.

Edit 2:
Tak sobie przypomniałem, że z bufferedReader kiedyś też już miałem problem. Ktoś mi to tłumaczył o co chodzi, ale niestety nie pamiętam. Dodałem dodatkowe odczytywanie linii w kliencie i niby działa. Teraz wygląda to tak

line = brSockInp.readLine();
brSockInp.readLine();
System.out.println("Otrzymano: " + line);