Java - Cliente/Servidor TCP

 
Vista:

Cliente/Servidor TCP

Publicado por Sandra (3 intervenciones) el 09/04/2023 17:21:57
Hola, tengo el siguiente código de un ejercicio Cliente/Servidor con TCP.
El cliente le indica al servidor el nombre del fichero que quiere, el servidor lee el fichero y se lo manda al cliente.
Hasta encontrar el fichero está correcto, pero el problema es cuando quiero enviar el fichero al cliente y mostrar su contenido.
Os pongo el código:

Servidor:

package emisorservidor;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
*
* @author sandr
*/
public class EmisorServidor {

static final int puerto = 4000;

public static void main(String[] args) throws IOException {

ServerSocket skServidor = new ServerSocket(puerto);//Utilizamos ServerSocket para indicar el puerto
System.out.println("Escucho el puerto: " + puerto);//Mostramos por consola el mensaje con el puerto establecido
Socket cliente = skServidor.accept();//Utilizamos Socket para aceptar a un cliente
System.out.println("Cliente conectado");//Mostramos por consola la conexión del cliente
OutputStream aux = cliente.getOutputStream();//Generamos una variable que utilizaremos en el DataOutputStream
DataOutputStream out = new DataOutputStream(aux);//Creamos el DataOutputStream para la salida de información
InputStream entrada = cliente.getInputStream();//Generamos una variable que utilizaremos en el DataInputStream
DataInputStream in = new DataInputStream(entrada);//Creamos el DataInputStream para la entrada de información del cliente
out.writeUTF("Introduce el nombre del fichero.");
String fichero = in.readUTF();
System.out.println("El cliente ha indicado el fichero: " + fichero);
File file = new File(fichero);
//BufferedReader reader = new BufferedReader(new FileReader(file));


if(file.exists()){

out.writeBoolean(true);
System.out.println("El fichero existe");

FileReader fr = new FileReader(file);
BufferedReader reader = new BufferedReader(fr);
String linea = reader.readLine();
while(linea != null){
out.writeUTF(linea);
linea = reader.readLine();
if(reader.readLine() == null){
out.writeUTF("FIN");
System.out.println("FIN");
}
}
reader.close();
cliente.close();

}else{
out.writeBoolean(false);
System.out.println("El fichero no existe");
}

}

}

Cliente:

package emisorservidor;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

/**
*
* @author sandr
*/
public class ReceptorCliente {

static final String host = "localhost";//Generamos un string con host del cliente
static final int puerto = 4000;//Generamos el puerto conectado con el puerto del servidor (3000)

public static void main(String[] args) throws IOException {

Socket cliente = new Socket(host, puerto);//Generamos en Socket con el puerto y el host inicializados anteriormente
InputStream aux = cliente.getInputStream();//Creamos una variable que utilizaremos en DataInputStream
DataInputStream in = new DataInputStream(aux);//Utilizamos DataInputStream para la entrada de información
OutputStream salida = cliente.getOutputStream();//Creamos una variable que utilizaremos en DataOutputStream
DataOutputStream out = new DataOutputStream(salida);//Utilizamos DataOutputStream para la salida de información
System.out.println(in.readUTF());//Leemos el mensaje del servidor

File file = new File("fichero");
String fichero = file.toString();
out.writeUTF(fichero);
System.out.println(fichero);

String entrada = in.readUTF();
while (entrada != null) {
System.out.println(entrada);
entrada = in.readUTF();
}
String fin = (in.readUTF());
if (fin.contains("FIN")) {
System.out.println("FIN");
}
cliente.close();
}

}


El resultado en el servidor:

run:
Escucho el puerto: 4000
Cliente conectado
El cliente ha indicado el fichero: fichero
El fichero existe
BUILD SUCCESSFUL (total time: 3 seconds)

El resultado del cliente:

run:
Introduce el nombre del fichero.
fichero
Exception in thread "main" java.io.EOFException
at java.io.DataInputStream.readUnsignedShort(DataInputStream.java:340)
at java.io.DataInputStream.readUTF(DataInputStream.java:589)
at java.io.DataInputStream.readUTF(DataInputStream.java:564)
at emisorservidor.ReceptorCliente.main(ReceptorCliente.java:35)
C:\Users\sandr\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 0 seconds)


Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder