elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
28 Mayo 2012, 01:32  


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java (Moderadores: Debci, Leyer)
| | | |-+  Cliente-servidor
0 Usuarios y 2 Visitantes están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: Cliente-servidor  (Leído 4,309 veces)
Leyer
Moderador
***
Desconectado Desconectado

Mensajes: 772


[]


Ver Perfil WWW
Re: Cliente-servidor
« Respuesta #15 en: 6 Enero 2010, 19:32 »

 ;) bien!

esta es la segunda forma

Código
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
 
/**
* @author Leyer
*/

public class ThreadForDownload extends Thread{
public static void main(String []args){
try {
new ThreadForDownload(new URL("http://www.tecnun.es/asignaturas/Informat1/ayudainf/aprendainf/Java/Java2.pdf"),"/home/leyer").start();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private URL           url          =   null;
private URLConnection connection   =   null;
private int offset = 0;
private boolean init   = true;
String path;
private FileOutputStream fileOutputStream;
public ThreadForDownload(
final URL URL,
String path) {
this.url = URL;this.path = path;
}
 
@Override
public synchronized void run() {
while(init){
try {
System.out.println("-----------------------------------");
System.out.println("Host: "+url.getHost());
System.out.println("NOmbre del Archivo: "+getFileName(url));
System.out.println("Tamaño: "+getLength(url));
System.out.println("-----------------------------------");
connection = url.openConnection();
} catch (IOException e) {System.err.println("Error in conection!");System.exit(0);
} catch (Exception e) {
e.printStackTrace();System.exit(0);
}
int read = 0;
final int SIZE = getLength(url);
InputStream stream  =  null;
try {
System.out.println("wait...");
   stream = connection.getInputStream();
fileOutputStream = new FileOutputStream(path+""+File.separator+getFileName(url));
final byte[] data = new byte[SIZE];
while((read = stream.read(data)) > 0){
offset +=read;
fileOutputStream.write(data,
0,
read);
  }
try{
System.out.println("Completado!");
fileOutputStream.flush();
fileOutputStream.close();
offset = 0;  init = false;
break;
   }catch (Exception e) { }
}catch (Exception e1) {
 }
  }
}
 
public void setInit(boolean init) {
this.init =false;
}
final int getLength(URL urlFile){
URLConnection connection = null;
int size = 0;
try {
connection = urlFile.openConnection();
size = connection.getContentLength();
} catch (IOException e) {
System.err.println(e+":ERROR");System.exit(0);
} catch (Exception e) {
System.err.println(e+":ERROR");System.exit(0);
}
return size;
}
private final String getFileName(URL URL){
    String path=URL.getPath();
    int lastIndexOf=path.lastIndexOf("/");
    String name = path.substring(lastIndexOf+1);
return name;
 
}
}

PD: lo hice al instante asi que errores en el codigo se aceptan


« Última modificación: 6 Enero 2010, 19:35 por LEYER » En línea

Debci
Moderador
***
Desconectado Desconectado

Mensajes: 1.945


Actualizate o muere!


Ver Perfil WWW
Re: Cliente-servidor
« Respuesta #16 en: 7 Enero 2010, 13:16 »

Ese codigo lo buscaba xD, mira un cosa que quiero hacer (Servira de ayuda para el post):

Quiero hacer una relacion del progreso, ver cuantos bytes quedan por descargar, y he querido hacerlo asi:

Código
int contador = getLength(url);
while((read = stream.read(data)) > 0){
                               contador--;
                               System.out.println(contador);
offset +=read;
                               contador--;
 
fileOutputStream.write(data,0,read);
  }
 
Pero no me da la salida que deberia, no se porque motivo,en teoria es asi disminuyo en 1 cada loop que pasa, o cuanto escribe por loop, creo que es eso el problema.

Saludos


En línea

Debci
Moderador
***
Desconectado Desconectado

Mensajes: 1.945


Actualizate o muere!


Ver Perfil WWW
Re: Cliente-servidor
« Respuesta #17 en: 7 Enero 2010, 13:28 »

Rectifico, ya lo he consegui, aqui el metodo:

Código
 int porcentaje = 0;
                       System.out.println(porcentaje);
while((read = stream.read(data)) > 0){
 
 
offset += read;
                               porcentaje = (offset * 100)/SIZE;
                               System.out.println(porcentaje);
 
fileOutputStream.write(data,0,read);
  }
 

Saludos
En línea

alzehimer_cerebral


Desconectado Desconectado

Mensajes: 515



Ver Perfil WWW
Re: Cliente-servidor
« Respuesta #18 en: 7 Enero 2010, 13:31 »

LEYER gracias por tu aporte uan vez mas, el ejemplo que me pones me gusta mas ya que lleva threads incorporados.  El codigo esta muy claro tambien.

Cualquier cosa os comento.

Salu2.

alzehimer_cerebral
En línea

Servicios Informaticos Valencia - www.ag-solutions.es
Mi blog - www.alvarogarciasolano.com
Leyer
Moderador
***
Desconectado Desconectado

Mensajes: 772


[]


Ver Perfil WWW
Re: Cliente-servidor
« Respuesta #19 en: 7 Enero 2010, 15:01 »

Rectifico, ya lo he consegui, aqui el metodo:

Código
 int porcentaje = 0;
                       System.out.println(porcentaje);
while((read = stream.read(data)) > 0){
 
 
offset += read;
                               porcentaje = (offset * 100)/SIZE;
                               System.out.println(porcentaje);
 
fileOutputStream.write(data,0,read);
  }
 

cierto esta listo para un progressBar aunke fuera bueno que en la salida se imprimiera en una sola linea y no salte a la siguiente desconozco eso.

LEYER gracias por tu aporte uan vez mas, el ejemplo que me pones me gusta mas ya que lleva threads incorporados.  El codigo esta muy claro tambien.
Cualquier cosa os comento.
Salu2.
alzehimer_cerebral
:)
En línea

Debci
Moderador
***
Desconectado Desconectado

Mensajes: 1.945


Actualizate o muere!


Ver Perfil WWW
Re: Cliente-servidor
« Respuesta #20 en: 7 Enero 2010, 15:23 »

Una cosa, si bajo algo grande (como la iso de open suse), me sale el length -1, alguna manera de que no pase?
En línea

Leyer
Moderador
***
Desconectado Desconectado

Mensajes: 772


[]


Ver Perfil WWW
Re: Cliente-servidor
« Respuesta #21 en: 7 Enero 2010, 15:41 »

mmm quisas el buffer este abarcano mucha memoria colocale 1024

Edit: tambien prueba el link que funciona
« Última modificación: 7 Enero 2010, 15:45 por LEYER » En línea

egyware


Desconectado Desconectado

Mensajes: 436


GameDeveloper


Ver Perfil WWW
Re: Cliente-servidor
« Respuesta #22 en: 10 Enero 2010, 22:15 »

No existe un metodo mas facil para descargar contenido de un servidor web y es usando InputStream de URL? sin necesidad de usar librerias externas
No habia leido la segunda parte me callo :-X

PS:
Citar
Una cosa, si bajo algo grande (como la iso de open suse), me sale el length -1, alguna manera de que no pase?
Dos cosas importantes
  • Los largos siempre se manejan en Long en cualquier OS, pero por comodidad siempre le hacemos casting a Int (hasta yo lo hago)
  • Como el largo esta manejado en long, maneja bien el buffer(este debe ser Int por eso hacemos lo de arriba), siempre en multiplos de 2 te recomiendo 1024*n donde n es un numero natural(Nota:los numeros naturales {1,2,3,...}
Saludos
2º PS:
Revisando el API me tope con esto
Citar
the content length of the resource that this connection's URL references, or -1 if the content length is not known.
Bueno antes de explicar devuelve un int al parecer lo que dije solo se aplica a archivos locales y no a web, tengo que confirmarlo. Y ahora explico si el contenido es -1 porque el largo no se conoce. Asi que debe ser problema del servidor que no entrega el largo.
3º PS:
Citar
getHeaderField(int n)
Revisa los Header talvez salga un numero tan grande que no se pueda convertir a int solo a long
« Última modificación: 10 Enero 2010, 22:37 por egyware » En línea

Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines