Detener la ejecución de este código.

Iniciado por 23time, 9 Julio 2010, 23:52 PM

0 Miembros y 2 Visitantes están viendo este tema.

23time

Buenas.

A ver si alguien me puede ayudar con este código.

Nos han dado en clase un par de códigos escritos en JAVA de un cliente/servidor utilizando sockets para pasar archivos a través de internet.

El caso es que, tras integrar el código en mi trabajito, tengo un problema con la creación del thread del server que me deja sin poder controlar el nuevo hilo. Lo que necesito es que el servidor se detenga una vez que ha recibido un fichero y no que se quede a la espera de nuevos clientes, sino que al recibir uno, termine la ejecución.

Os dejo el código.

Código (java) [Seleccionar]

ServerSocket server;
        Socket connection;

        DataOutputStream output;
        BufferedInputStream bis;
        BufferedOutputStream bos;

        byte[] receivedData;
        int in;
        String file;

        try{
            server = new ServerSocket( 1234 );
            g.setjTextField1("Servidor arrancado");

            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());
                file = file.concat("_host");

                bos = new BufferedOutputStream(new FileOutputStream(file));
                while ((in = bis.read(receivedData)) != -1){
                    bos.write(receivedData,0,in);
                }
                bos.close();
                dis.close();
            }
        }catch (Exception e ) {
            System.err.println(e);
        }


No se si es porque estoy cansado o porque ya estoy tan quemado que no consigo verlo xD, pero si alguien me puede echar una mano se lo agradecería mucho :)

Un saludo!!!


Leyer

#1
al recibir uno solo ? usa un
Código (java) [Seleccionar]
break y ya :xD

Podrias crear un nuevo hilo que descargue el fichero
y cuando aceptas la conexion usas break; ; anteriormente tuviste que aver llamado el hilo de descarga. aunke es lo mismo

un saludo.

joseprox

#2
Código (java) [Seleccionar]
 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());
               file = file.concat("_host");

               bos = new BufferedOutputStream(new FileOutputStream(file));
               while ((in = bis.read(receivedData)) != -1){
                   bos.write(receivedData,0,in);
               }
               bos.close();
               dis.close();
               
             break;

           }

Prueba con esto y me dices.....
sino enviame el codigo completo el server y el cliente...
estoy atento.......
Toda persona tiene derecho a cometer errores...
la verdad es q solo ella es RESPONSABLE DE LO QUE HACE.....!!!!!

Debci

O cambia la condicion del while, porque de esa manera siempre se ejecuta.

Saludos

23time

Buenas chavales.

Perdón por no haber contestado antes al post, pero empecé las vacaciones al poco de publicar el post y hasta ahora no he parado xD

La verdad es que no conseguí detener la ejecución del código, aunque utilicé el break tras cerrar los buffers y, como eso no funcionaba, le cambié la condición de ejecución cambiando el boolean al transmitir el archivo.

Por eso acudí aquí a ver si alguien me podía ayudar. Sinceramente, creo que es un problema del propio JAVA, ya que he estado usando swing y creo que es ahí donde falla.

De todas formas, como es un servidor se supone que debe estar "al loro" siempre, por lo que decidí separarlo de mi aplicación (ya que me la bloqueaba). En teoría se detendría al mandar el mensaje propicio desde el cliente, el cual cambia la condición del while con un break.

Como se suele decir, si mahoma no va a la montaña, la montaña va a mahoma xD, la cuestión era encontrar una solución al problema.

Gracias a todos aquellos que han intentado ayudarme :D

Saludos!!.


Debci

Cita de: 23time en 24 Julio 2010, 04:17 AM
Buenas chavales.

Perdón por no haber contestado antes al post, pero empecé las vacaciones al poco de publicar el post y hasta ahora no he parado xD

La verdad es que no conseguí detener la ejecución del código, aunque utilicé el break tras cerrar los buffers y, como eso no funcionaba, le cambié la condición de ejecución cambiando el boolean al transmitir el archivo.

Por eso acudí aquí a ver si alguien me podía ayudar. Sinceramente, creo que es un problema del propio JAVA, ya que he estado usando swing y creo que es ahí donde falla.

De todas formas, como es un servidor se supone que debe estar "al loro" siempre, por lo que decidí separarlo de mi aplicación (ya que me la bloqueaba). En teoría se detendría al mandar el mensaje propicio desde el cliente, el cual cambia la condición del while con un break.

Como se suele decir, si mahoma no va a la montaña, la montaña va a mahoma xD, la cuestión era encontrar una solución al problema.

Gracias a todos aquellos que han intentado ayudarme :D

Saludos!!.
La solucion a tu problema tiene un nombre:
THREADS!!!

Saludos

23time

Buenas Debci.

Si llegué a utilizar threads, aunque, como no los había usado antes leí que cometí un mal uso, por lo que no se si el error estaba ahí.

En el desarrollo del trabajó necesité 2 threads, el primero que creé lo hice extendiendo de Thread y sobrecargando el método run..., esa parte me funciona a las mil maravillas pero leí que es una mala práctica, ya que luego necesité crear otro y me decidí a hacerlo de otra forma preguntándole a Google.

El segundo que creé lo que hice fue implementar Runnable y llamar al thread:

new Thread(new servidor()).start();

Ahí es donde comencé a tener problemas, puede que se petara por tener el primer thread con el run() machacado, es algo que desconozco porque nunca he trabajao con threads antes y por eso acudí al foro.

Una vez que separé el servidor de mi aplicación y observé que aun así se me quedaba bloqueado, terminé echándole las culpas a swing, ya que ejecuto dos .jar distintos,  mi aplicación y el segundo, el server, el cual es llamado desde mi aplicación.

Así que no se...  :-\

¿Es mejor hacerlo implementando Runnable en vez de extender de la clase Thread?, lo cambiaré y contaré como fue la cosa.

Un saludo!!.


Debci

Cita de: 23time en 24 Julio 2010, 18:32 PM
Buenas Debci.

Si llegué a utilizar threads, aunque, como no los había usado antes leí que cometí un mal uso, por lo que no se si el error estaba ahí.

En el desarrollo del trabajó necesité 2 threads, el primero que creé lo hice extendiendo de Thread y sobrecargando el método run..., esa parte me funciona a las mil maravillas pero leí que es una mala práctica, ya que luego necesité crear otro y me decidí a hacerlo de otra forma preguntándole a Google.

El segundo que creé lo que hice fue implementar Runnable y llamar al thread:

new Thread(new servidor()).start();

Ahí es donde comencé a tener problemas, puede que se petara por tener el primer thread con el run() machacado, es algo que desconozco porque nunca he trabajao con threads antes y por eso acudí al foro.

Una vez que separé el servidor de mi aplicación y observé que aun así se me quedaba bloqueado, terminé echándole las culpas a swing, ya que ejecuto dos .jar distintos,  mi aplicación y el segundo, el server, el cual es llamado desde mi aplicación.

Así que no se...  :-\

¿Es mejor hacerlo implementando Runnable en vez de extender de la clase Thread?, lo cambiaré y contaré como fue la cosa.

Un saludo!!.
Es mas rapido y eficaz hacerlo directamente con Thread, ademas, si pones un bucle while o for dentro del thread de ejecucion de Swing (No olvides que es un thread) lo que haces es saturar la interfaz y provocar cosas como esta.

Un saludo