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


0