Foros del Web » Programación para mayores de 30 ;) » Java »

transferencia de archivo binario por sockets

Estas en el tema de transferencia de archivo binario por sockets en el foro de Java en Foros del Web. Hola buenas. Vereis, estoy haciendo un pequeño programa con sockets en java para transferir un fichero binario (una cancion). El servidor le envia al cliente ...
  #1 (permalink)  
Antiguo 02/04/2006, 08:36
 
Fecha de Ingreso: abril-2006
Mensajes: 1
Antigüedad: 18 años, 7 meses
Puntos: 0
transferencia de archivo binario por sockets

Hola buenas. Vereis, estoy haciendo un pequeño programa con sockets en java para transferir un fichero binario (una cancion). El servidor le envia al cliente el tamaño por un flujo de texto para que el cliente vaya recibiendo bytes del fichero hasta completar el tamaño. La cosa es que me da error de cliente y no se porque. Llevo 3 dias dandole vueltas y nada, me estoy volviendo loco. Ahi os dejo el codigo por si quereis ayudarme. Muchas gracias:

Servidor
======

import java.net.*;
import java.io.*;

class Servidor{
public static void main(String[] args){
try{
ServerSocket sSrv=new ServerSocket(7777);
File fich= new File("blur.mp3");
FileInputStream fichEntrada=new FileInputStream(fich);
int paquete;
long tamanioFichero=fich.length();
while (true){
Socket sCli=sSrv.accept();
System.out.println("Cliente ha conectado");
PrintWriter salidaTexto=new PrintWriter(sCli.getOutputStream(),true);
DataOutputStream salidaBinario = new DataOutputStream(sCli.getOutputStream());
salidaTexto.print(tamanioFichero);
while((paquete=(byte)fichEntrada.read())!=-1){
salidaBinario.write(paquete);
}
fichEntrada.close();
sCli.close();
System.out.println("Cliente ha desconectado");
}
}
catch (IOException e){
System.out.println("Error en servidor");}
}
}


Cliente
=====

import java.net.*;
import java.io.*;

class Cliente {

public static void main(String[] args) {
try {
File fich= new File("blur.mp3");
FileOutputStream fichSalida=new FileOutputStream(fich);
Socket sCli=new Socket("localhost",7777);
System.out.println("Cliente ha conectado");
BufferedReader entradaTexto=new BufferedReader(new InputStreamReader(sCli.getInputStream()));
DataInputStream entradaBinario = new DataInputStream(sCli.getInputStream());
long tamanioFichero=entradaTexto.read();
int paquete;
for(int i=0; i<20; i++){//tamanioFichero; i++){
paquete = entradaBinario.readByte();
fichSalida.write(paquete);
}
fichSalida.close();
sCli.close();
}
catch (UnknownHostException e){
System.out.println("HOst desconocido");}
catch (IOException e){
System.out.println("Error en cliente");}
}}



EDIT: se me olvido decir que el cliente y servidor estan en carpetas distintas, por eso no es el problema.
  #2 (permalink)  
Antiguo 27/04/2006, 12:37
 
Fecha de Ingreso: abril-2006
Mensajes: 8
Antigüedad: 18 años, 7 meses
Puntos: 0
Mensaje Fichero Binario

No estoy muy seguro, pero que si cambias la linea siguente:

BufferedReader entradaTexto=new BufferedReader(new InputStreamReader(sCli.getInputStream()));

por esta otra:

DataInputStream entradaTexto = new DataInputStream(s.getInputStream());

deberia funcionar.

Ah!!, y al leer el tamaño del fichero y escribir seria con:
entradaTexto.readLong();
salidaTexto.writeLong(tamaño);


Creo que nada mas. Espero que te sirva de ayuda.

Saludos
  #3 (permalink)  
Antiguo 27/04/2006, 15:29
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 20 años, 1 mes
Puntos: 454
Hola:

En http://www.chuidiang.com/java/socket...ro_socket.html tienes un ejemplo ya hecho que transmite ficheros en general.
Va un poco a piñón fijo (siempre transmite el fichero), pero quizás te sirva el código para darte alguna idea.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #4 (permalink)  
Antiguo 27/04/2006, 16:45
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 21 años, 1 mes
Puntos: 51
Los Readers/Writers son para leer/escribir flujos de caracteres y no puedes usarlos para pasar archivos binarios, ya que realizan transformaciones en los caracteres que envian. Para flujos de bytes has de usar InputStream/OutputStream y derivados.

Un saludo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:11.