Duda Cliente/Servidor con Socket en Java
Publicado por Javier (54 intervenciones) el 01/02/2018 12:57:08
Hola, tengo un ejercicio hecho en java en la que un cliente se conecta a un servidor. El cliente manda al servidor el nombre de un archivo, el servidor comprueba si existe y si existe manda el archivo al cliente, luego el cliente lo muestra por pantalla.
El ejercicio lo tengo hecho y funciona perfectamente pero he tenido mandar al cliente un booleano a true para que funcianara.
Me explico, en el código del servidor, cuando el servidor va leyendo byte a byte el archivo y mandándolo al cliente, una vez que ha mandado todos los bytes si ejecuto el programa me salta un error en el cliente de null, EOFException.
Para que no me de error y funcione perfectamente tengo que escribir en el servidor un write.boolean(true), si lo pongo a false no funciona. El caso es que no se por qué sucede esto, es decir, en el cliente no recojo un readboolean para saber si se ha mandado un true o false. Os dejo el código tanto del Servidor como del cliente para ver si veis en qué fallo o en qué no me doy cuenta. Muchas gracias
CODIGO SERVIDOR.
CODIGO CLIENTE
El ejercicio lo tengo hecho y funciona perfectamente pero he tenido mandar al cliente un booleano a true para que funcianara.
Me explico, en el código del servidor, cuando el servidor va leyendo byte a byte el archivo y mandándolo al cliente, una vez que ha mandado todos los bytes si ejecuto el programa me salta un error en el cliente de null, EOFException.
Para que no me de error y funcione perfectamente tengo que escribir en el servidor un write.boolean(true), si lo pongo a false no funciona. El caso es que no se por qué sucede esto, es decir, en el cliente no recojo un readboolean para saber si se ha mandado un true o false. Os dejo el código tanto del Servidor como del cliente para ver si veis en qué fallo o en qué no me doy cuenta. Muchas gracias
CODIGO SERVIDOR.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author Javier
*/
public class MandarArchivoCliente {
private ServerSocket servidor = null;
private Socket cliente = null;
private FileReader fr = null;
private BufferedReader br = null;
private String rutaFichero = null;
private DataOutputStream dos = null;
private DataInputStream dis = null;
private File archivo = null;
private boolean existeFichero = false;
private boolean archivoTerminado = false;
public MandarArchivoCliente(){
try {
servidor = new ServerSocket(1500);
cliente = servidor.accept();
dis = new DataInputStream(cliente.getInputStream());
dos = new DataOutputStream(cliente.getOutputStream());
do {
rutaFichero = dis.readUTF();//RECIBIMOS LA RUTA DEL FICHERO
archivo = new File(rutaFichero);
if(archivo.exists()) {
dos.writeBoolean(true);//MANDAMOS QUE EXISTE EL FICHERO
existeFichero = true;
}else {
dos.writeBoolean(false);
existeFichero = false;
}
}while(existeFichero == false);
//ahora deberemos de ir mandando los bytes del archivo
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(archivo));
int leer;
while((leer = bis.read()) != -1) {
//archivoTerminado = false;
dos.writeByte(leer);//Mandamos el byte del archivo
}
bis.close();
dos.writeBoolean(true);//TENGO QUE ESCRIBIR ESTA LÍNEA PARA QUE FUNCIONE EL PROGRAMA
servidor.close();
cliente.close();
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
}
public static void main(String[] args) {
new MandarArchivoCliente();
}
}
CODIGO CLIENTE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author Javier
*/
public class RecibirArchivoServidor {
private File archivo = null;
private BufferedWriter bw = null;
private Socket cliente = null;
private String nombreFichero = null;
private Scanner sca = null;
private DataInputStream dis = null;
private DataOutputStream dos = null;
private boolean existeFichero = false;
private boolean terminado = false;
public RecibirArchivoServidor() {
try {
cliente = new Socket("localhost", 1500);
dis = new DataInputStream(cliente.getInputStream());
dos = new DataOutputStream(cliente.getOutputStream());
sca = new Scanner(System.in);
do {
System.out.println("Escribe el nombre del fichero");
nombreFichero = sca.nextLine();
dos.writeUTF(nombreFichero);//MANDAMOS EL NOMBRE DEL FICHERO
existeFichero = dis.readBoolean();
if(!existeFichero){
System.out.println("EL FICHERO NO EXISTE, ESCRIBA DE NUEVO");
}
}while(existeFichero == false);
File archivo = new File("ayayay.txt");
archivo.createNewFile();
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(archivo));
int lee;
while((lee = dis.readByte()) != 1) {
bos.write(lee);
}
bos.close();
cliente.close();
sca.close();
BufferedReader br = new BufferedReader(new FileReader("ayayay.txt"));
String linea;
while((linea = br.readLine()) != null) {
System.out.println(linea);
}
} catch (IOException ex) {
System.out.println(ex.getMessage());
System.out.println(ex.toString()); }
}
public static void main(String[] args) {
new RecibirArchivoServidor();
}
}
Valora esta pregunta


0