El servidor TCP Java recibió todas las líneas del Cliente cuando se enviaron todas

Escribí dos pequeños programas java: un cliente TCP que envía muchas líneas de datos desde un archivo txt, y un servidor TCP que acepta la conexión y recibe línea por línea.

Funciona, pero el Servidor recibe todas las líneas juntas, cuando finaliza la transmisión y el cliente cierra el socket. No entiendo por qué, porque estoy usando flush después de cada línea enviada al Cliente, y siempre pensé que era para evitar este tipo de situación.

Si mi archivo test.txt contiene los números 1 2 3 ... 10, cada uno en una nueva línea, la salida del servidor es: "12345678910" y luego en una nueva línea escribe en la consola "nulo".

Código del servidor:

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

class ServidorTCP {

  private String HOST;
  static final int PUERTO = 20001;

      public ServidorTCP( ) {
        try{
          ServerSocket skServidor = new ServerSocket(PUERTO);
              Socket skCliente = skServidor.accept();
          DataInputStream inFromClient = new DataInputStream(new BufferedInputStream(skCliente.getInputStream()));

          while(true){
              String lineaLeida = inFromClient.readUTF();
              if(lineaLeida.equals("END")) break;
              System.out.println(lineaLeida);
          }
              inFromClient.close();
              skCliente.close();
          skServidor.close();
          System.out.println( "Transmission ended" );
        } catch( Exception e ) {
          System.out.println( e.getMessage() );
        }
      }


      public static void main( String[] arg ) {
        new ServidorTCP();
      }

    }

Código de cliente:

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

class ClienteTCP {

  static final String HOST = "192.168.1.201";
  static final int PUERTO = 20001;

  public ClienteTCP( ) {
    try{
      Socket skCliente = new Socket(HOST, PUERTO);
      if(skCliente.isConnected()) System.out.println("Connected!");
      DataOutputStream outToServer = new DataOutputStream(skCliente.getOutputStream());

      File testFile = new File("test.txt");
      BufferedReader input = new BufferedReader(new FileReader(testFile));
      String line;
      while((line=input.readLine())!=null) {
        if(!line.endsWith("\n")) line = line + "\n";
        System.out.println("Sending: " + line);
        outToServer.writeBytes(line);
        outToServer.flush();
        Thread.currentThread().sleep(1000);
      }
      outToServer.writeBytes("END");
      input.close();
      outToServer.close();
      skCliente.close();
    } catch( Exception e ) {
      System.out.println( e.getMessage() );
    }
  }


  public static void main( String[] arg ) {
    new ClienteTCP();
  }

}

¿Dónde está el problema?

EDITAR: he editado el código como se sugiere. Ahora no recibe nada

Respuesta 1

Me gustaría entender cómo funciona la función de línea de tiempo de Etherpad. Si no conoce el software etherpad, aquí hay una implementación del mismo: http://piratepad.net/ Haga algunas ediciones, escriba algo, haga ...

El programa que estoy tratando de construir, consume archivos en un recurso compartido de archivos de Windows usando Camel 2.18.5 y otros programas ocasionalmente agregan / modifican / eliminan archivos en la carpeta compartida. Construyendo una ruta de prueba simple ...

Tengo que descargar muchas páginas web y voy a usar HttpURLConnection para hacerlo porque es muy conveniente. Sin embargo, no quiero usar descargas basadas en hilos. Deseo usar async ...

Tengo dos listas y tengo que crear un mapa a partir de ellas. Uno, estoy iterando en bucle y segundo, quería ser arrojado por una secuencia y luego recolectar en el mapa, pero no tengo idea de cómo usar los recopiladores ...