Foro de elhacker.net

Programación => Java => Mensaje iniciado por: alzehimer_cerebral en 4 Enero 2010, 23:22 pm



Título: Cliente-servidor
Publicado por: alzehimer_cerebral en 4 Enero 2010, 23:22 pm
Hola necesito que una aplicacion del lado cliente se conecte a un servidor remoto para descargarse una estructura de directorios con sus contenidos a las maquinas clientes y cargarlas en la aplicacion cliente...

Estoy haciendo pruebas con la API java_net y me surge la duda si para lo que yo necesito me tengo que programar un programa que corra en el servidor??  o si con programar en el cliente una conexion remota a un servidor  Apache y mediante sentencias de programacion ya puedo conseguir traerme la estructura de directorios???

Haber si alguien me ayuda a visualizar lo que necesito programar...

Salu2

alzehimer_cerebral


Título: Re: Cliente-servidor
Publicado por: Leyer en 4 Enero 2010, 23:31 pm
tienes que que comunicarte con el servidor por x comando el servidor recibe y ejecuta el procedimiento de listar los directorios y envias al cliente la lista ...que llevas hecho?

 


Título: Re: Cliente-servidor
Publicado por: panaka en 5 Enero 2010, 00:31 am
Mira te explico un poco por encima lo que tienes que hacer:
Tienes dos clases, una servidor con serverScoket escuchando en un puerto, y otra clase cliente con socket, te conectas al serverSocket, es decir, has establecido la conexion mira la API es muy sencillo.

Una vez hecho esto en el servidor te creas un objeto de la clase FILE y con su metodo list() te devuelve un array con los directorios/archivos que contiene, y si tienes establecida la conexion solo tienes que devolverlo... ya sea con serializacion de objetos o por string... eso ya depende de lops conocimientos que tengas.

Saludos


Título: Re: Cliente-servidor
Publicado por: alzehimer_cerebral en 6 Enero 2010, 14:33 pm
Pues de momento no tengo nada hecho, solo estoy empezando a jugar con la API y parece bastante sencillo.  Me han dicho que no tengo que crear un proceso que corra en la parte del servidor, ya que me vale con colgar el contenido en un servidor Apache y la parte cliente lo que tiene que hacer es conectarse a dicho servidor para traerse un fichero .xml que contiene los objetos con los cuales debo trabajar...

De momento tengo un servidor Apache con una pagina colgada, en este mismo servidor me gustaria poner el fichero .xml correspondiente para empezar a hacer las pruebas, lo que nose es en que directorio del servidor Apache colocar dicho fichero para que la parte cliente pueda acceder a el, nose si me he explicado bien..

Gracias por los aportes y feliz año a todos!!

Saludos.

alzehimer_cerebral


Título: Re: Cliente-servidor
Publicado por: Debci en 6 Enero 2010, 16:52 pm
Envezde usar un file, te recomiendoq ue generas el arbol en un array y lo transmitas por dataoutput, luego al recibirlo lo recorres con algun bucle logico y lo muestreas, o simplemnete envias cada elemento del array en orden y tal cual lo recives lo construyes.


Saludos


Título: Re: Cliente-servidor
Publicado por: Leyer en 6 Enero 2010, 17:27 pm
osea pero el servidor lo tienes que creear tu, un servidor apache no es necesario a no ser que te conectes http://localhost:8081/ en tu apache

Saludos!


Título: Re: Cliente-servidor
Publicado por: alzehimer_cerebral en 6 Enero 2010, 18:05 pm
Por lo que me han dicho tengo que hacer un programa (parte cliente) que se conecte a un servidor Apache y coja un .xml...

No tengo que preocuparme del programa en la parte servidor ya que el propio Apache supuestamente lo gestiona todo..

Queda mas claro ahora.  Que metodos existen para traerse un fichero de un servidor remoto??

Derrepente el Netbeans ya no me mete las excepciones de forma automatica al darle a la bobillita en la linea de codigo que la solicita, alguien sabe a que e debe??

Salu2.

alzehimer_cerebral


Título: Re: Cliente-servidor
Publicado por: Leyer en 6 Enero 2010, 18:44 pm
bueno solo  te quedaria solo descargarlo del servidor como cuarquier archivo :P

Salu2


Título: Re: Cliente-servidor
Publicado por: alzehimer_cerebral en 6 Enero 2010, 18:52 pm
He encontrado el siguiente codigo http://www.seraphinux.com/index.php/855/2009/08/24/java-descargar-archivos-desde-un-servidor-remoto/ (http://www.seraphinux.com/index.php/855/2009/08/24/java-descargar-archivos-desde-un-servidor-remoto/).  Lo que pasa que no se como añadir las librerias que utiliza.  Alguien sabe donde conseguir as librerias??

Un saludo.

alzehimer_cerebral


Título: Re: Cliente-servidor
Publicado por: Leyer en 6 Enero 2010, 19:11 pm
esta es la lib http://www.java2s.com/Code/JarDownload/commons-httpclient.jar.zip

Saludos!


Título: Re: Cliente-servidor
Publicado por: -Ramc- en 6 Enero 2010, 19:15 pm
Me parece que alguien debe leerse un buen tutorial de Sockets, en el paquete .net está todo lo que necesitas, toma el InputStream del socket, empieza a leer los datos que te envia el server y ya lo tienes.


Título: Re: Cliente-servidor
Publicado por: Leyer en 6 Enero 2010, 19:19 pm
Me parece que alguien debe leerse un buen tutorial de Sockets, en el paquete .net está todo lo que necesitas, toma el InputStream del socket, empieza a leer los datos que te envia el server y ya lo tienes.
:P pero si el lo esta haciendo asi ps que lo siga haciendo no es mucha la diferencia


Título: Re: Cliente-servidor
Publicado por: -Ramc- en 6 Enero 2010, 19:21 pm
Me parece que alguien debe leerse un buen tutorial de Sockets, en el paquete .net está todo lo que necesitas, toma el InputStream del socket, empieza a leer los datos que te envia el server y ya lo tienes.
:P pero si el lo esta haciendo asi ps que lo siga haciendo no es mucha la diferencia
Ahh, lo está haciendo todo con esa api? pensé que usaba la .net por el primer comentario y ahora iba a usar esta y terminaría un revuelto de código, pero, si está con una sóla api, que siga. xD


Título: Re: Cliente-servidor
Publicado por: alzehimer_cerebral en 6 Enero 2010, 19:25 pm
Simplemente estoy buscando formas de hacerlo y la verdad que la segunda me parece mas comoda de momento.  Con lo que he visto parece ser que con net API habria que tambien programar un proceso que corra en el servidor Apache y que se sincronizase con el proceso cliente, mientras que con los metodos http esto no hace falta. 

LEYER ya me he bajado la libreria donde la descomprimo para poder utilizarla?

Salu2

alzehimer_cerebral


Título: Re: Cliente-servidor
Publicado por: -Ramc- en 6 Enero 2010, 19:30 pm
Debe tener uno o más .jar o class, tienes dos opciones, metes la ruta donde lo tienes en el classpath o compilas directamente indicandole el classpath.

Código:
javac -classpath "$CLASSPATH:.:/usr/lib/jdk1.6.0_10/jre/lib/ext/libreria.jar" Prueba.java 


Título: Re: Cliente-servidor
Publicado por: Leyer en 6 Enero 2010, 19:32 pm
 ;) bien!

esta es la segunda forma

Código
  1. import java.io.File;
  2. import java.io.FileOutputStream;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.net.MalformedURLException;
  6. import java.net.URL;
  7. import java.net.URLConnection;
  8.  
  9. /**
  10.  * @author Leyer
  11.  */
  12. public class ThreadForDownload extends Thread{
  13. public static void main(String []args){
  14. try {
  15. new ThreadForDownload(new URL("http://www.tecnun.es/asignaturas/Informat1/ayudainf/aprendainf/Java/Java2.pdf"),"/home/leyer").start();
  16. } catch (MalformedURLException e) {
  17. // TODO Auto-generated catch block
  18. e.printStackTrace();
  19. }
  20. }
  21. private URL           url          =   null;
  22. private URLConnection connection   =   null;
  23. private int offset = 0;
  24. private boolean init   = true;
  25. String path;
  26. private FileOutputStream fileOutputStream;
  27. public ThreadForDownload(
  28. final URL URL,
  29. String path) {
  30. this.url = URL;this.path = path;
  31. }
  32.  
  33. @Override
  34. public synchronized void run() {
  35. while(init){
  36. try {
  37. System.out.println("-----------------------------------");
  38. System.out.println("Host: "+url.getHost());
  39. System.out.println("NOmbre del Archivo: "+getFileName(url));
  40. System.out.println("Tamaño: "+getLength(url));
  41. System.out.println("-----------------------------------");
  42. connection = url.openConnection();
  43. } catch (IOException e) {System.err.println("Error in conection!");System.exit(0);
  44. } catch (Exception e) {
  45. e.printStackTrace();System.exit(0);
  46. }
  47. int read = 0;
  48. final int SIZE = getLength(url);
  49. InputStream stream  =  null;
  50. try {
  51. System.out.println("wait...");
  52.    stream = connection.getInputStream();
  53. fileOutputStream = new FileOutputStream(path+""+File.separator+getFileName(url));
  54. final byte[] data = new byte[SIZE];
  55. while((read = stream.read(data)) > 0){
  56. offset +=read;
  57. fileOutputStream.write(data,
  58. 0,
  59. read);
  60.   }
  61. try{
  62. System.out.println("Completado!");
  63. fileOutputStream.flush();
  64. fileOutputStream.close();
  65. offset = 0;  init = false;
  66. break;
  67.    }catch (Exception e) { }
  68. }catch (Exception e1) {
  69.  }
  70.   }
  71. }
  72.  
  73. public void setInit(boolean init) {
  74. this.init =false;
  75. }
  76. final int getLength(URL urlFile){
  77. URLConnection connection = null;
  78. int size = 0;
  79. try {
  80. connection = urlFile.openConnection();
  81. size = connection.getContentLength();
  82. } catch (IOException e) {
  83. System.err.println(e+":ERROR");System.exit(0);
  84. } catch (Exception e) {
  85. System.err.println(e+":ERROR");System.exit(0);
  86. }
  87. return size;
  88. }
  89. private final String getFileName(URL URL){
  90.     String path=URL.getPath();
  91.     int lastIndexOf=path.lastIndexOf("/");
  92.     String name = path.substring(lastIndexOf+1);
  93. return name;
  94.  
  95. }
  96. }

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


Título: Re: Cliente-servidor
Publicado por: Debci en 7 Enero 2010, 13:16 pm
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
  1. int contador = getLength(url);
  2. while((read = stream.read(data)) > 0){
  3.                                contador--;
  4.                                System.out.println(contador);
  5. offset +=read;
  6.                                contador--;
  7.  
  8. fileOutputStream.write(data,0,read);
  9.   }
  10.  
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


Título: Re: Cliente-servidor
Publicado por: Debci en 7 Enero 2010, 13:28 pm
Rectifico, ya lo he consegui, aqui el metodo:

Código
  1. int porcentaje = 0;
  2.                        System.out.println(porcentaje);
  3. while((read = stream.read(data)) > 0){
  4.  
  5.  
  6. offset += read;
  7.                                porcentaje = (offset * 100)/SIZE;
  8.                                System.out.println(porcentaje);
  9.  
  10. fileOutputStream.write(data,0,read);
  11.   }
  12.  

Saludos


Título: Re: Cliente-servidor
Publicado por: alzehimer_cerebral en 7 Enero 2010, 13:31 pm
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


Título: Re: Cliente-servidor
Publicado por: Leyer en 7 Enero 2010, 15:01 pm
Rectifico, ya lo he consegui, aqui el metodo:

Código
  1. int porcentaje = 0;
  2.                        System.out.println(porcentaje);
  3. while((read = stream.read(data)) > 0){
  4.  
  5.  
  6. offset += read;
  7.                                porcentaje = (offset * 100)/SIZE;
  8.                                System.out.println(porcentaje);
  9.  
  10. fileOutputStream.write(data,0,read);
  11.   }
  12.  

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
:)


Título: Re: Cliente-servidor
Publicado por: Debci en 7 Enero 2010, 15:23 pm
Una cosa, si bajo algo grande (como la iso de open suse), me sale el length -1, alguna manera de que no pase?


Título: Re: Cliente-servidor
Publicado por: Leyer en 7 Enero 2010, 15:41 pm
mmm quisas el buffer este abarcano mucha memoria colocale 1024

Edit: tambien prueba el link que funciona


Título: Re: Cliente-servidor
Publicado por: egyware en 10 Enero 2010, 22:15 pm
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