Foro de elhacker.net

Programación => Java => Mensaje iniciado por: jossydeleon en 2 Septiembre 2010, 20:13 pm



Título: [SOLUCIONADO]Duda Barra de Progreso en Transferencia de Archivos (Java)
Publicado por: jossydeleon en 2 Septiembre 2010, 20:13 pm
Hola gente del foro soy nuevo por aki y quiero pedirles ayuda en un problemita que tengo.

Estoy realizando una aplicacion en Java que me permita el envio de archivos usando Sockets con una aplicacion Cliente y una Servidor. El cliente se conecta al servidor y este le envia un archivo a Servidor. Pero quisiera poner una Barra de progreso que me muestre cuanto falta para terminar el proceso de transferencia. He buscado pero no doy con la solucion. He aki mi codigo:

Código
  1. //Cliente
  2. import java.net.*;
  3. import java.io.*;
  4. import javax.swing.*;
  5.  
  6. class Cliente
  7. {
  8.  public static void main (String[] args)
  9.  {
  10.  
  11.      int in;
  12.      byte[] byteArray;
  13.      File archivo = null;
  14.      String direccionArchivo = null;
  15.      String IP = null;
  16.  
  17.      try
  18.      {
  19.          IP = JOptionPane.showInputDialog(null,"Ingrese la direccion IP a la cual desea conectarse","Cliente",JOptionPane.CANCEL_OPTION);
  20.          Socket via = new Socket(IP, 1234);
  21.          if(via.isConnected())
  22.          {
  23.            JOptionPane.showMessageDialog(null, "Conectado al servidor: " + IP);
  24.  
  25.            JFileChooser selector = new JFileChooser();
  26.            selector.setDialogTitle("Selecciona el archivo a enviar");
  27.            int resultado = selector.showOpenDialog(null);
  28.            if (resultado == JFileChooser.APPROVE_OPTION)
  29.            {
  30.                archivo = selector.getSelectedFile();
  31.                direccionArchivo = archivo.getPath().toString();
  32.            }
  33.  
  34.            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(direccionArchivo));
  35.            BufferedOutputStream bos = new BufferedOutputStream(via.getOutputStream());
  36.  
  37.            //Enviamos el nombre del archivo
  38.            DataOutputStream dos = new DataOutputStream(via.getOutputStream());
  39.            dos.writeUTF(archivo.getName());
  40.  
  41.            byteArray = new byte[8192];
  42.            while ((in = bis.read(byteArray)) != -1)
  43.            {
  44.                bos.write(byteArray,0,in);
  45.            }
  46.  
  47.            bis.close();
  48.            bos.close();
  49.  
  50.            JOptionPane.showMessageDialog(null, "El archivo: " + archivo.getName().toString() +
  51.                                                 " se envio correctamente!");
  52.        }
  53.  
  54.      }catch (Exception e) {JOptionPane.showMessageDialog(null,e,"Error",JOptionPane.ERROR_MESSAGE);}
  55.   }
  56. }  
  57.  


Código
  1. //Servidor
  2.  
  3. import java.net.*;
  4. import java.io.*;
  5. import javax.swing.*;
  6.  
  7. class Servidor
  8. {
  9.     public static void main (String[] args)
  10.     {
  11.         ServerSocket server;
  12.         Socket connection = null;
  13.  
  14.         DataOutputStream output;
  15.         BufferedInputStream bis;
  16.         BufferedOutputStream bos;
  17.  
  18.         byte[] receivedData;
  19.         int in;
  20.         String file;
  21.  
  22.         try{
  23.             server = new ServerSocket(1234);
  24.             while ( true ) {
  25.                 connection = server.accept();
  26.  
  27.                 receivedData = new byte[1024];
  28.                 bis = new BufferedInputStream(connection.getInputStream());
  29.                 DataInputStream dis = new DataInputStream(connection.getInputStream());
  30.  
  31.                 //recibimos el nombre del fichero
  32.                 file = dis.readUTF();
  33.                 file = file.substring(file.indexOf('/')+1,file.length());
  34.  
  35.                 //aqui se escribe el archivo en la ubicacion donde este el Servidor.jar
  36.                 bos = new BufferedOutputStream(new FileOutputStream("/" + file));
  37.                 while ((in = bis.read(receivedData)) != -1){
  38.                     bos.write(receivedData,0,in);
  39.                 }
  40.                 bos.close();
  41.                 dis.close();
  42.  
  43.                 JOptionPane.showMessageDialog(null, "Archivo (" + file.toString() + ") Recibido satisfactoriamente");
  44.                 System.exit(0);
  45.             }
  46.         }catch (Exception e ) {
  47.             JOptionPane.showMessageDialog(null,e, "Errror",JOptionPane.ERROR_MESSAGE);
  48.         }
  49.     }
  50. }
  51.  


Buscando en la Web encontre un codigo para desarrollar un JProgressBar

Código:
public void iterate() {
  while (num < 2000) {
  current.setValue(num);
  try {
  Thread.sleep(1000);
  } catch (InterruptedException e) { }
  num += 95;
  }
  }


Si pueden ayudarme a fusionar El cliente y Servidor con la JProgress Bar se lo agradeceria mucho.

Muchas Gracias


Título: Re: Duda Barra de Progreso en Transferencia de Archivos (Java)
Publicado por: Leyer en 2 Septiembre 2010, 21:06 pm
Esta es una forma, pero existe otra que es setear el maximo del progressBar a 100 y usar int c=(leido*100)/tamaño; ya la aplicaras después

Código
  1. JDialog dialog = new JDialog();
  2.            JProgressBar progressBar=new JProgressBar(0, 100);
  3.            dialog.setSize(190, 80);
  4.            progressBar.setStringPainted(true);
  5.            dialog.add(progressBar);
  6.            dialog.setLocationRelativeTo(null);
  7.            dialog.setVisible(true);
  8.            byteArray = new byte[8192];
  9.            long size=archivo.length(), c=0;
  10.            int l=0;
  11.            System.out.println(size);
  12.            progressBar.setMaximum((int)size);
  13.            while ((in = bis.read(byteArray)) != -1)
  14.            {
  15.             l+=in;
  16.                bos.write(byteArray,0,in);
  17.                progressBar.setValue(l);
  18.            }
  19.  
  20.            bis.close();
  21.            bos.close();

Puedes hacer algo similar en el servidor.

Un saludo.


Título: Re: Duda Barra de Progreso en Transferencia de Archivos (Java)
Publicado por: jossydeleon en 2 Septiembre 2010, 21:38 pm
Muchisimas gracias LEYER por responder a mi duda... Voy a probar el codigo e implentar uno parecido al lado del cliente. De nuevo muchisimas Gracias  :D


Título: Re: Duda Barra de Progreso en Transferencia de Archivos (Java)
Publicado por: jossydeleon en 2 Septiembre 2010, 22:18 pm
LEYER De nuevo muchas gracias funciono el codigo que pusiste y lo pude implementar en el Servidor. Ahora quiero poner un boton que diga cancelar pero solo en la parte del Cliente.

Creo un boton y lo inserto en el JDialog y le agrego un evento, pero no se con que instruccion detener el proceso de copia ????¿¿¿¿


Título: Re: Duda Barra de Progreso en Transferencia de Archivos (Java)
Publicado por: Debci en 2 Septiembre 2010, 23:03 pm
LEYER De nuevo muchas gracias funciono el codigo que pusiste y lo pude implementar en el Servidor. Ahora quiero poner un boton que diga cancelar pero solo en la parte del Cliente.

Creo un boton y lo inserto en el JDialog y le agrego un evento, pero no se con que instruccion detener el proceso de copia ????¿¿¿¿

Pues haz que la condición del for o el while que uses para transferencia se cumpla o incumpla (dependiendo) y asi lo paras?

Saludos


Título: Re: Duda Barra de Progreso en Transferencia de Archivos (Java)
Publicado por: Leyer en 3 Septiembre 2010, 03:44 am
LEYER De nuevo muchas gracias funciono el codigo que pusiste y lo pude implementar en el Servidor. Ahora quiero poner un boton que diga cancelar pero solo en la parte del Cliente.

Creo un boton y lo inserto en el JDialog y le agrego un evento, pero no se con que instruccion detener el proceso de copia ????¿¿¿¿

Pues haz que la condición del for o el while que uses para transferencia se cumpla o incumpla (dependiendo) y asi lo paras?

Saludos

Tienes que tener en cuenta como lo esta haciendo, Fíjate que si implementa una acción del button, no podrá crear una variable booleana dentro del actionPerformed ya que le pedirá que esa variable sea inmutable (Final)

La solución en ese caso seria, que organices mas el código, ya que como lo tienes sera engorroso implementar la acción de cancelar.

Fijate que puedes hacer esto:

Código
  1. Action action=new AbstractAction("Cancelar") {
  2. private static final long serialVersionUID = 1L;
  3. @Override
  4. public void actionPerformed(ActionEvent e) {
  5. cancel = true;
  6. }
  7. };
  8. button.setAction(action);  

Pero en tu caso, tendrías que colocar la variable booleana cancel como variable de clase, osea con el modificador static para poder acceder a modificar esa variable.

Y así poder hacer la verificación si se cancelo la tranferencia.

Example:
Código
  1. while ((in = bis.read(byteArray)) != -1){
  2. if(Cliente.cancel){
  3.             System.err.println("Tranferencia cancelada.");
  4.             dialog.dispose();
  5.             bis.close();
  6.                 bos.close();
  7.             break;
  8.            }
  9. //.....................
  10. //etc
  11. }
  12.  

Pero mi recomendación final es que organices tu codigo.

Un saludo.





Título: Re: Duda Barra de Progreso en Transferencia de Archivos (Java)
Publicado por: jossydeleon en 3 Septiembre 2010, 05:01 am
LEYER de nuevo muchas gracias... voy a seguir tu recomendacion aunke ya habia realizado ese evento. Sino que era por cuestion de tiempo y estaba desesperado por entregar ese taller, Como siempre buen colombiano jejeje.

Bueno como es la primera vez que entro a este foro no se como hago para cerrarlo y ponerlo como solucionado.

Gracias :-*


Título: Re: Duda Barra de Progreso en Transferencia de Archivos (Java)
Publicado por: Leyer en 3 Septiembre 2010, 05:20 am
De nada amigo , bueno los usuarios normales no pueden cerrar un post tiene que ser algún moderador , déjamelo a mi.

Cualquier otra problema aquí estamos :)
Un saludo.