[SOLUCIONADO]Duda Barra de Progreso en Transferencia de Archivos (Java)

Iniciado por jossydeleon, 2 Septiembre 2010, 20:13 PM

0 Miembros y 1 Visitante están viendo este tema.

jossydeleon

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 (java) [Seleccionar]

//Cliente
import java.net.*;
import java.io.*;
import javax.swing.*;

class Cliente
{
 public static void main (String[] args)
 {

     int in;
     byte[] byteArray;
     File archivo = null;
     String direccionArchivo = null;
     String IP = null;

     try
     {
         IP = JOptionPane.showInputDialog(null,"Ingrese la direccion IP a la cual desea conectarse","Cliente",JOptionPane.CANCEL_OPTION);
         Socket via = new Socket(IP, 1234);
         if(via.isConnected())
         {
           JOptionPane.showMessageDialog(null, "Conectado al servidor: " + IP);

           JFileChooser selector = new JFileChooser();
           selector.setDialogTitle("Selecciona el archivo a enviar");
           int resultado = selector.showOpenDialog(null);
           if (resultado == JFileChooser.APPROVE_OPTION)
           {
               archivo = selector.getSelectedFile();
               direccionArchivo = archivo.getPath().toString();
           }

           BufferedInputStream bis = new BufferedInputStream(new FileInputStream(direccionArchivo));
           BufferedOutputStream bos = new BufferedOutputStream(via.getOutputStream());

           //Enviamos el nombre del archivo
           DataOutputStream dos = new DataOutputStream(via.getOutputStream());
           dos.writeUTF(archivo.getName());

           byteArray = new byte[8192];
           while ((in = bis.read(byteArray)) != -1)
           {
               bos.write(byteArray,0,in);
           }

           bis.close();
           bos.close();

           JOptionPane.showMessageDialog(null, "El archivo: " + archivo.getName().toString() +
                                                " se envio correctamente!");
       }

     }catch (Exception e) {JOptionPane.showMessageDialog(null,e,"Error",JOptionPane.ERROR_MESSAGE);}
  }
}  



Código (java) [Seleccionar]

//Servidor

import java.net.*;
import java.io.*;
import javax.swing.*;

class Servidor
{
    public static void main (String[] args)
    {
        ServerSocket server;
        Socket connection = null;

        DataOutputStream output;
        BufferedInputStream bis;
        BufferedOutputStream bos;

        byte[] receivedData;
        int in;
        String file;

        try{
            server = new ServerSocket(1234);
            while ( true ) {
                connection = server.accept();

                receivedData = new byte[1024];
                bis = new BufferedInputStream(connection.getInputStream());
                DataInputStream dis = new DataInputStream(connection.getInputStream());

                //recibimos el nombre del fichero
                file = dis.readUTF();
                file = file.substring(file.indexOf('/')+1,file.length());

                //aqui se escribe el archivo en la ubicacion donde este el Servidor.jar
                bos = new BufferedOutputStream(new FileOutputStream("/" + file));
                while ((in = bis.read(receivedData)) != -1){
                    bos.write(receivedData,0,in);
                }
                bos.close();
                dis.close();

                JOptionPane.showMessageDialog(null, "Archivo (" + file.toString() + ") Recibido satisfactoriamente");
                System.exit(0);
            }
        }catch (Exception e ) {
            JOptionPane.showMessageDialog(null,e, "Errror",JOptionPane.ERROR_MESSAGE);
        }
    }
}



Buscando en la Web encontre un codigo para desarrollar un JProgressBar


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

Leyer

#1
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 (java) [Seleccionar]
JDialog dialog = new JDialog();
           JProgressBar progressBar=new JProgressBar(0, 100);
           dialog.setSize(190, 80);
           progressBar.setStringPainted(true);
           dialog.add(progressBar);
           dialog.setLocationRelativeTo(null);
           dialog.setVisible(true);
           byteArray = new byte[8192];
           long size=archivo.length(), c=0;
           int l=0;
           System.out.println(size);
           progressBar.setMaximum((int)size);
           while ((in = bis.read(byteArray)) != -1)
           {
            l+=in;
               bos.write(byteArray,0,in);
               progressBar.setValue(l);
           }

           bis.close();
           bos.close();


Puedes hacer algo similar en el servidor.

Un saludo.

jossydeleon

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

jossydeleon

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 ????¿¿¿¿

Debci

Cita de: 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 ????¿¿¿¿

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

Leyer

Cita de: Debci en  2 Septiembre 2010, 23:03 PM
Cita de: 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 ????¿¿¿¿

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 (java) [Seleccionar]
Action action=new AbstractAction("Cancelar") {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
cancel = true;
}
};
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 (java) [Seleccionar]

while ((in = bis.read(byteArray)) != -1){
if(Cliente.cancel){
            System.err.println("Tranferencia cancelada.");
            dialog.dispose();
            bis.close();
                 bos.close();
            break;
            }
//.....................
//etc
}


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

Un saludo.




jossydeleon

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

Leyer

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.