Servidor

Juan
17 de Mayo del 2006
Buenas estoy realizando un cliente/servidor en el que el cliente tiene que mandar un archivo al servidor y me da este error:

java.io.EOFException
at java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(Unknown Source)
at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
at java.io.ObjectInputStream.<init>(Unknown Source)
at Java.socket_fichero.Servidor.run(Servidor.java:34)

Si alguien me podria decir porque es?(Si necesitais el codigo para saberlo decirmelo)

NoDo
17 de Mayo del 2006
Hola buenas!

Bien. A ver, EOF significa que el fichero a llegado al final del fichero, y claro, si no compruebas si ha llegado o no, posiblemente te salte esa excepcion.

Creo que lo mejor que podrías hacer sería:
Parte Cliente
----------------------------------------
//Creas el fichero a subir
File f = new File(nombreFicheroConExtension));

//Instancias un flujo de entrada;
FileInputStream fis = new FileInputStream(f));

//A continuacion, lees byte a byte:
long tamanio=f.length();//tamaño del fichero

//Mandamos nombre del fichero y tamaño en este orden:
salida.println(nombreFicheroConExtension);
salida.flush();//forzamos la salida
salida.println(tamanio);

long contador=0;

while(contador<tamanio){//mientras no lleguemos al tamaño del fichero, seguimos enviando.
escribir.write(fis.read());
escribir.flush();
contador++;
}
fis.close(); //cerramos flujo de entrada de fichero.

Parte Servidor
---------------------------------
String nombreFichero = entrada.readLine();//se supone que le mandas el nombre a traves de un socketTexto

String tam = entrada.readLine();//cogemos el tamaño
long tamanio = Long.parseLong(tam);//pasamos el tamaño a long

//Creamos flujo de salida a fichero
FileOutputStream fos = new FileOutputStream(nombreFichero);
try {
System.out.println("Subiendo...");
long contador = 0;
while (contador < tamanio) {
fos.write(leer.read());
contador++;
}
System.out.println("Completado");
}
catch (FileNotFoundException fnfe) {
System.out.println("Fichero no Existe");
}
finally {
fos.close();
}


Bien, con esto deberías poder pasar un fichero de texto por ejemplo a un servidor TCP.

Se pasaría byte a byte.

Para instanciar los sockets,se hace:
Tanto en la parte cliente como en la parte servidor
//Para texto
Socket skTexto;
PrintWriter salida = new PrintWriter(skTexto.getOutputStream,true);//para la salida

BufferedReader entrada = new BufferedReader(new InputStreamReader(skTexto.getInputStream()));//para la entrada

//Para bytes
Socket skBytes;
DataOutputStream escribir = new DataOutputStream(skBytes.getOutputStream());//salida de bytes.

DataInputStream leer = new DataInputStream(skBytes.getInputStream());//entrada de bytes

Por ultimo, debes saber que en la parte servidor, el servidor debe esperar dos conexiones.

Socket skTexto=...//a gusto del consumidor
Socket SkBytes=...

SocketServer ss = new SocketServer(int puerto);

skTexto = ss.accept();
skBytes = ss.accept();

Bien, con esto deberías de poder subir un fichero en modo binario a través de un socket.

Venga,un saludo y comenta si te sirve o no.

Juan
17 de Mayo del 2006
Este es mi codigo que manda el fichero al cliente:

public void manda(String Fichero, String Servidor, int Puerto){
try{
Socket Socket = new Socket(Servidor, Puerto);

ObjectOutputStream Oos = new ObjectOutputStream(Socket.getOutputStream());

boolean EnviadoUltimo = false;
// Se abre el fichero.
FileInputStream FicheroEnviar = new FileInputStream(Fichero);

// Se instancia y rellena un mensaje de envio de fichero
MensajeTomaFichero Mensaje = new MensajeTomaFichero();
Mensaje.nombreFichero = Fichero;

// Se leen los primeros bytes del fichero en un campo del mensaje
int Leidos = FicheroEnviar.read(Mensaje.contenidoFichero);

// Bucle mientras se vayan leyendo datos del fichero
while (Leidos > -1){

// Se rellena el número de bytes leidos
Mensaje.bytesValidos = Leidos;

// Si no se han leido el máximo de bytes, es porque el fichero
// se ha acabado y este es el último mensaje
if (Leidos < MensajeTomaFichero.LONGITUD_MAXIMA){
Mensaje.ultimoMensaje = true;
EnviadoUltimo = true;
}else
Mensaje.ultimoMensaje = false;

// Se envía por el socket
Oos.writeObject(Mensaje);

// Si es el último mensaje, salimos del bucle.
if (Mensaje.ultimoMensaje){
break;
}else{
// Se crea un nuevo mensaje
Mensaje = new MensajeTomaFichero();
Mensaje.nombreFichero = Fichero;

// y se leen sus bytes.
Leidos = FicheroEnviar.read(Mensaje.contenidoFichero);
}
}

if (EnviadoUltimo == false){
Mensaje.ultimoMensaje = true;
Mensaje.bytesValidos = 0;
Oos.writeObject(Mensaje);
}
// Se cierra el ObjectOutputStream
Oos.close();
} catch (Exception e){
e.printStackTrace();
}
}
}


Y este el del servidor:

private void RecibeFichero(String Fichero, ObjectOutputStream Oos){
try{

// Se envía un mensaje de petición de fichero.
MensajeTomaFichero Mensaje = new MensajeTomaFichero();

// Se abre un fichero para empezar a copiar lo que se reciba.
FileOutputStream FicheroCopia = new FileOutputStream(Mensaje.nombreFichero + "_copiaServidor");

// Se crea un ObjectInputStream del socket para leer los mensajes
// que contienen el fichero.
ObjectInputStream Ois = new ObjectInputStream(Cliente.getInputStream());
MensajeTomaFichero MensajeRecibido;
Object MensajeAux;
do{
// Se lee el mensaje en una variabla auxiliar
MensajeAux = Ois.readObject();

// Si es del tipo esperado, se trata
if (MensajeAux instanceof MensajeTomaFichero){
MensajeRecibido = (MensajeTomaFichero) MensajeAux;
// Se escribe en pantalla y en el fichero
System.out.print(new String(MensajeRecibido.contenidoFichero, 0, MensajeRecibido.bytesValidos));
FicheroCopia.write(MensajeRecibido.contenidoFichero, 0, MensajeRecibido.bytesValidos);
}else{
// Si no es del tipo esperado, se marca error y se termina
// el bucle
System.err.println("Mensaje no esperado " + MensajeAux.getClass().getName());
break;
}
}while (!MensajeRecibido.ultimoMensaje);

// Se cierra socket y fichero
FicheroCopia.close();
Ois.close();
Cliente.close();

}catch (Exception e){
e.printStackTrace();
}
}

En sentido contrario, es decir, mandar desde el servidor al cliente si lo hace, pero al reves no hay manera de que me salga

Muhcas gracias

NoDo
17 de Mayo del 2006
Hola!

Prueba el código que te puse yo, que es transferencia binaria de cliente a servidor.

Espero que te sirva.

Un saludo.

Juan
17 de Mayo del 2006
Es que tengo que transmitir un fichero de texto, pero de todas formas muchas gracias. :)

NoDo
17 de Mayo del 2006
Hola!

Bien, simplemente decirte que es igual lo que quieras transmitir. Sea de texto o sea una foto, lo que estas haciendo es transmitir el archivo en sí, por decirlo de una manera. Vamos, que es lo mismo transmitir linea a linea de un fichero que transmitirlo byte a byte, quizá más rápido y "económico" byte a byte, pero bueno, los gustos son los gustos.

Venga, suerte con ello.

Un saludo.