Recent Posts

Pages: [1] 2 3 ... 10
1
Java JSE / Re: Proeblema en transferencia de archivos
« Last post by Jaia on Enero 15, 2019, 04:31:08 pm »
Este tipo de explicaciones son las que deberían venir en los libros.

Muchísimas gracias.
2
Java JSE / Re: Proeblema en transferencia de archivos
« Last post by chuidiang on Enero 15, 2019, 04:21:55 pm »
Hola:

Cuando lees un array (   n = entrada.read(b) ) no tienes garantía de leer TODOS los bytes del array, sobre todo en socket que los bytes circulan por red y  pueden no haber llegado todavía todos los bytes necesarios para rellenar el array al completo. De hecho, n te está diciendo cuántos bytes has leído y debes usar ese valor de n para saber cuántos bytes hay en el array que han sido leidos.

Deberías hacer algo parecido a esto

Code: [Select]
byte[] b = new byte[8192];
                while ((n = entrada.read(b)) != -1) {
                    salida.write(b, 0, n);   // bytes, empezando en el 0, hasta n
                }

También podias dejarlo como lo tenias, bytes de uno en uno, pero lo que no puedes hacer es usar entrada.ready() para decidir que has llegado al final del socket. Si el byte no ha llegado cuando preguntas, ready() te dira que no hay byte, pero no porque se hayan terminado de enviar, sino porque solo porque no ha llegado todavía.

Saludos.
3
Java JSE / Re: Proeblema en transferencia de archivos
« Last post by Jaia on Enero 14, 2019, 08:40:37 pm »
Bueno he realizado algunos cambios pero realmente no sé lo que está pasando.

Tenías razón sobre lo del buffer y conseguí resolver el problema en parte. Ahora me escribe todos los bytes, por lo menos en lo que a la cantidad se refiere, pero escribe lo que quiere ya que es ilegible.

Abrir el archivo directamente con alguna aplicación es imposible, no lo reconoce, y al abrir el archivo con un editor hexadecimal, y comparar el original y el transferido, pues veo que no se parecen en nada.

En el servidor tengo esto:

Code: [Select]
@Override
    public void run() {
        try {
            entradaStr = new BufferedReader(new InputStreamReader(this.so.getInputStream()));
            entrada = new DataInputStream(new BufferedInputStream(this.so.getInputStream()));
            String linea = entradaStr.readLine();
            System.out.println("Linea: " + linea);
            String[] str = linea.split("&");
            System.out.println("str: " + Arrays.toString(str));
            for (String s : str) {
                System.out.println(s);
            }
            String comando = str[0];
            String nombre = str[1];
            Long tam = Long.valueOf(str[2].trim());
            salida = new DataOutputStream(new FileOutputStream(new File(nombre)));
            byte[] b = new byte[8192];
            int n;
            while ((n = entrada.read(b)) != -1) {
                salida.write(b);
            }
            entradaStr.close();
            entrada.close();
            salida.flush();
            salida.close();
        } catch (IOException ioe) {
            ioe.printStackTrace();
            System.exit(0);
        }
        System.exit(0);
    }

Y en el cliente:
Code: [Select]
public static void main(String[] args) {
        JFileChooser selector = new JFileChooser();
        selector.setFileSelectionMode(JFileChooser.FILES_ONLY);
        selector.setMultiSelectionEnabled(false);
        int res = selector.showOpenDialog(selector);
        if (res == JFileChooser.APPROVE_OPTION) {
            File fila = selector.getSelectedFile();
            String nombre = fila.getName();
            String tam = String.valueOf(fila.length());
            String comando = "UP";
            String remoto = "127.0.0.1";
            String del = "&";
            int puerto = 57000;
            try {
                Socket so = new Socket(remoto, puerto);
                so.setSoLinger(true, 5);
                String linea = comando + del + nombre + del + tam + "\n";
                DataInputStream entrada = new DataInputStream(new FileInputStream(fila));
                DataOutputStream salida = new DataOutputStream(new BufferedOutputStream(so.getOutputStream()));
                salida.writeBytes(linea);
                int n;
                byte[] b = new byte[8192];
                while ((n = entrada.read(b)) != -1) {
                    salida.write(b);
                }
                entrada.close();
                salida.flush();
                salida.close();
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
           
        }
    }

He puesto un buffer como me indicabas pero ya digo que no comprendo como hacer esto de forma correcta.

No estoy obligado a utilizar esta fórmula ni mucho menos, tengo flexibilidad total, pero me llega al alma no comprender algo que en principio es sencillo, y que aparentemente sobre el papel es correcto.

No lo comprendo.
4
Java JSE / Re: Problema al comunicar JFrame con base de datos Access
« Last post by Jaia on Enero 14, 2019, 08:26:58 pm »
Me alegra poder haber sido de ayuda.

Un saludo.
5
Java JSE / Re: Problema al comunicar JFrame con base de datos Access
« Last post by hgc on Enero 14, 2019, 08:09:21 pm »
Hola.
El ID lo trato como String para que me sea más cómodo con otros métodos. Es para una práctica, no una situación real. Por eso lo hago así.

Pero efectivamente el fallo era el pasarle un argumento al método excuteUpdate(). Ahora ya me funciona como quería.
Muchas gracias por tu ayuda.
Un saludo.
6
Java JSE / Re: Proeblema en transferencia de archivos
« Last post by chuidiang on Enero 14, 2019, 05:30:44 pm »
Hola:
Si haces varias pruebas y transmites el mismo fichero varias veces ... ¿siempre tiene el mismo tamaño lo que recibes o cada vez es distinto?
Veo que escribes byte a byte y que lees byte a byte con el ready(). Si el que escribe no lo hace a la suficiente velocidad, es posible que se te corte en cualquier momento. El efecto debería ser que a veces va, a veces no y cuando no va, el fichero recibido será más pequeño, pero unas veces tendrá un tamaño y otras otro.
Saludos.
7
Java JSE / Re: Problema al comunicar JFrame con base de datos Access
« Last post by Jaia on Enero 14, 2019, 02:52:21 am »
Hola:

No sé si será el caso concreto, pero a mí me ha sucedido en varias ocasiones que al crear la base de datos suelo poner el ID del registro como entero y autoincrementado. Con esto quiero decir que he visto que el Codigo_empleado lo tratas como String. Eso por un lado. Por otro, si fuera el caso, al tratarse de un entero con autoincremento no es necesario parase un Codigo_empleado, puesto que ese problema lo debería resolver el gestor de la base de datos. Así tu insert quedaría de la siguiente manera:
Code: [Select]
INSERT INTO Empleados (Nombre_empleado, Telefono) values(?, ?)
Otra cosa que veo es que ps.executeUpdate() no debería llevar argumentos.

Yo revisaría esto.
8
Java JSE / Proeblema en transferencia de archivos
« Last post by Jaia on Enero 13, 2019, 10:41:09 pm »
Hola:

Estoy con un programa que se ejecuta una parte en el cliente y otra en el servidor. Quiero conectar ambas aplicaciones para que puedan realizar una transferencia de archivos. Después de pelear con el código y de los BrokenPipe y los Reset que me lanzaba, ya he conseguido que se conecten.

Ahora el problema surge cuando quiero transferir archivos de un sitio a otro. Al finalizar la transferencia me doy cuenta de que el archivo recibido es menor que el transferido. Es decir, que si el archivo original pesa 3MB el servidor lee y almacena 2.7MB.

En el lado del servidor tengo:
Code: [Select]
public class CmdThread extends Thread {

    private final Socket SO;
    private final BufferedReader entrada;
    private final BufferedOutputStream salida;
    private String peticion, cmd, nombreArchivo;
    private Long tam;

    public CmdThread(Socket SO) throws IOException {
        this.SO = SO;
        if (this.SO != null) {
            entrada = new BufferedReader(new InputStreamReader(this.SO.getInputStream()));
            salida = new BufferedOutputStream(this.SO.getOutputStream());
        } else {
            entrada = null;
            salida = null;
        }
    }

    @Override
    public void run() {
        try {
            peticion = entrada.readLine();
            System.out.println("Peticion: " + peticion);
            String[] str = peticion.split("&");
            System.out.println("Paramns: " + Arrays.toString(str));
            cmd = str[0];
            nombreArchivo = str[1];
            tam = Long.valueOf(str[2]);
            BufferedOutputStream salidaDisco = new BufferedOutputStream(new FileOutputStream(new File(nombreArchivo)));
            while (entrada.ready()) {
                salidaDisco.write(entrada.read());
            }
            salida.flush();
            salida.close();
            salidaDisco.flush();
            salidaDisco.close();
            entrada.close();
        } catch (IOException ex) {
            Logger.getLogger(CmdThread.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

}

Y en el lado del cliente esto:
Code: [Select]
public class ArchivosCliente {

    public static void main(String[] args) throws IOException {
        JFileChooser selector = new JFileChooser();
        selector.setFileSelectionMode(JFileChooser.FILES_ONLY);
        int res = selector.showOpenDialog(selector);
        if (res == JFileChooser.APPROVE_OPTION) {
            File fila = selector.getSelectedFile();
            String comando = "UP";
            String del = "&";
            String nombreArchivo = fila.getName();
            String remoto = "127.0.0.1";
            int puerto = 57000;
            String tam = String.valueOf(fila.length());
            Socket so = new Socket(remoto, puerto);
            so.setSoLinger(true, 5);
            BufferedOutputStream salida = new BufferedOutputStream(so.getOutputStream());
            BufferedInputStream entrada = new BufferedInputStream(new FileInputStream(fila));
            System.out.println("Peticion: " + comando + del + nombreArchivo + del + tam + "\n");
            salida.write((comando + del + nombreArchivo + del + tam + "\n").getBytes());
            int n;
            while ((n = entrada.read()) != -1) {
                salida.write(n);
            }
            salida.flush();
            salida.close();
            entrada.close();
        }
    }

}

No entiendo en dónde se encuentra el error. No hay ninguna excepción y alerta ni ninguna pista que me ayude a tirar del hilo para averiguar el error o la causa del problema.

Alguna sugerencia?
9
Java JSE / Problema al comunicar JFrame con base de datos Access
« Last post by hgc on Enero 13, 2019, 10:27:10 pm »
Hola!
Tengo un problema que no consigo resolver. A ver si alguien me puede ayudar.

Tengo una aplicación Java que consta de un JFrame principal en el que presento en un ComboBox una serie de opciones a realizar sobre una base de datos Access.

Tengo la clase "BD" en la que creé todos los métodos que se comunican con la BD(crearTabla(), insertEmpleado(), etc...). Otra clase en la que creo el JFrame de la imagen anterior, y después pretendía crear ventanas adicionales para algunas funciones como insertar empleados.
Cuando selecciono por ejemplo la opción "3-Dar de alta un empleado" hago que se abra un JDialog para introducir los datos del nuevo empleado.

Yo pretendo que, una vez introducidos los datos y pulsado el botón "Crear empleado", se llame al método "insertEmpleado()" de la clase "BD" y se introduzcan los datos en la BD, pero me da fallo.

Dejo el código relacionado con el problema.

Método insertEmpleado() de la clase "BD":
Code: [Select]
public void insertEmpleados(String cod, String nombre, String telf){
        String s="INSERT INTO Empleados (Codigo_empleado, Nombre_empleado, Telefono) VALUES(?,?,?)";
        con=crearConexion();
       
        try {
            ps=con.prepareStatement(s);
            ps.setString(1, cod);
            ps.setString(2, nombre);
            ps.setString(3, telf);
            ps.executeUpdate(s);
            JOptionPane.showMessageDialog(null, "Empleado añadido correctamente");
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Se ha producido un error", "Error", JOptionPane.ERROR_MESSAGE);
            System.err.println(ex.getMessage());
            ex.printStackTrace();
        }finally{
            try {
                if(ps!=null){
                    ps.close();
                }
                if(con!=null){
                    con.close();
                }
            } catch (SQLException ex) {
                System.err.println(ex.getMessage());
            }
        }
    }

Método listener del botón del JFrame principal:
Code: [Select]
private void btnAceptarActionPerformed(java.awt.event.ActionEvent evt) {                                           
        int opcion=combo.getSelectedIndex();
       
        switch (opcion){
            case 0:
                JOptionPane.showMessageDialog(null, "Primero debes escoger una de opciones indicadas");
                break;
               
            case 1:
                bd.crearEmpleados();
                break;
               
            case 2:
                bd.crearOrdenes();
                break;
               
            case 3:
                new InsertarEmpleados(this, true).setVisible(true);
                break;
        }
    }

Método listener del botón del JDialog para dar de alta empleados:
Code: [Select]
private void btnCrearActionPerformed(java.awt.event.ActionEvent evt) {                                         
        new BD().insertEmpleados(codigo.getText(), nombre.getText(), telf.getText());
    }

No sé si es problema de mi código, si es problema del driver que utilizo para conectar con Access o qué demonios es.
Ya sé que la duda es algo enrevesada, pero cualquier ayuda será agradecida.
10
ya resolvi, el error estaba en la configuration de netbeans el classmain que tenia en la configuracion de netbeans no coincide con la que tenia en maven. mainclass de maven estaba correcto pero el de netbeans estaba incorecto, al igualar el mainclass de netbeans ya pude ejecutar la aplicacion
Pages: [1] 2 3 ... 10
ey