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
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 ...