elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Evitar bloqueo del metodo read() de un objeto Socket en java/j2me
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Evitar bloqueo del metodo read() de un objeto Socket en java/j2me  (Leído 4,434 veces)
cyber33

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Evitar bloqueo del metodo read() de un objeto Socket en java/j2me
« en: 3 Enero 2013, 05:24 am »

Hola a todos. Estoy tratando de buscar una forma de evitar el bloqueo que se produce al llamar al método read() cuando se usa un objeto SocketConnection (j2me) o Socket (java). Estoy usando j2me en este momento pero igual se extiende lo mismo usando java. Por el momento el metodo available() no me sirve de mucho ya que en su mayoria devuelve cero. Esto era una buena alternativa para leer cuantos datos hay disponibles y asi evitar el bloqueo pero la descarto. Por otra parte esta el método read(byte[],position,length). Es casi lo mismo que read() pero se leen varios bytes en el array.

El siguiente codigo podria funcionar muy bien pero no se puede utilizar is.available(). Además este metodo proceso() esta ejecutandose dentro de un hilo.
Código
  1.  public void proceso(){
  2.              try {
  3.                  int d=is.available();
  4.                  if(d!=0){
  5.                      byte[] bytes=new byte[d];
  6.                      int offset=0;
  7.                      while(offset<bytes.length){
  8.                          int value=is.read(bytes,offset, d);
  9.                          if(value==-1)break;
  10.                          offset+=value;
  11.                      }
  12.                      int i=0;
  13.                      while(i<bytes.length){
  14.                          System.out.print((char)bytes[i]);
  15.                          i++;
  16.                      }
  17.                  }          
  18.              } catch (IOException ex) {
  19.              }
  20.  }
  21.  

Y el siguiente codigo que por cierto es ineficiente igual puede bloquearse en la linea is.read() segun lo que probe.

Código
  1. public void proceso1(){
  2.        try {
  3.            int d=is.read();
  4.            while(d!=-1){
  5.                System.out.println((char)d);
  6.                d=is.read();      
  7.            }
  8.        } catch (IOException ex) {
  9.            ex.printStackTrace();
  10.        }
  11.  }
  12.  
  13. Una forma mas eficiente de esto para leer que hize fue leer con el metodo read(byte[],position,length). Pero aún se bloquea.
  14.  

Eh notado que si el procesamiento es mas lento se bloquee porque quizas no esten los datos rapidamente disponibles. En cambio si ya estan entonces no se bloquearia en la linea de is.read(). Solo es una observación. Nose como hacen realmente las aplicaciones de este tipo.

Espero que me puedan ayudar a buscar una forma para evitar este bloqueo.

Desde ya muchas gracias.

Saludos.[/color]


En línea

juancaa

Desconectado Desconectado

Mensajes: 140


[ Img^(Img) = Real ]


Ver Perfil
Re: Evitar bloqueo del metodo read() de un objeto Socket en java/j2me
« Respuesta #1 en: 5 Enero 2013, 01:58 am »

Si lo que quieres es comprobar si tu objeto Socket o bien InputStream o OutputStream estan disponibles me temo que lo que deberias utilizar es synchronized.  Y por lo que respecta al boqueo tengo el mismo problema pero creo que se puede solucionar estableciendo un tiempo limite a la transmision, algo como en caso de que no recibas datos en 1000 ms entonces seguir ejeutando codigo pero esto no lo he probado...

Un ejemplo de synchronized de un codigo mio...

Código
  1.    public byte[] readBytes (Socket socket) {
  2.        byte[] data = null;
  3.  
  4.        try {
  5.            DataInputStream dis = new DataInputStream(socket.getConnection().getInputStream());
  6.            synchronized (dis) {
  7.                int len = dis.readInt();
  8.                data = new byte[len];        
  9.                if (len > 0) dis.readFully(data);            
  10.            }
  11.        } catch (IOException ex) { System.out.println("Error reading input bytes"); }
  12.        return data;
  13.    }

No se si es esto lo que buscabas exactamente, ya me diras... Un saludo y felices fiestas!


En línea

Que tengas un buen dia!
cyber33

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: Evitar bloqueo del metodo read() de un objeto Socket en java/j2me
« Respuesta #2 en: 7 Enero 2013, 20:00 pm »

Hola felices fiestas, gracias por contestar. Estuve probando el codigo que escribiste y me sale una excepción "Exception in thread "Thread-0" java.lang.OutOfMemoryError: Java heap space". Porque cuando se lee en la linea int len=readInt() me devuelve un valor de 1010792557 y por consecuencia en data = new byte[len] es muy grande el valor. No habia utilizado el método readInt(). Suelo utilizar mas el read() que lee byte por byte. Aunque nose si lo entiendo bien al método readInt() que según dice la documentación lee de a cuatro bytes y es raro que me de un número de 1010792557. Por otra parte estuve probando sobre el bloqueo y llego a la conclusión que se va a bloquear siempre en el metodo read(). Solo recien cuando lleguen mas datos se va a desbloquear. Y esto es leyendo byte por byte. Lo que si nose muy bien es como leer de más de un byte ahi si se bloquea para siempre según lo que probe. Por ejemplo si creo un array de byte de 1024 de capacidad y luego utilizo el metodo read(byte[] b) entonces si solo hay 500 datos disponibles en el flujo entonces se bloqueara ahi y no podra avanzar más. Solo pense que puede ser porque todavia no logro llenar los 1024 bytes de capacidad del array. Probe enviar mas datos para ver si se llena pero aun quedo bloqueado. Solo si es justa la cantidad entonces no se va a bloquear. En otras palabras habria que saber la cantidad de bytes que hay y eso seria utilizando available() pero ya lo tengo descartado.


Saludos.
« Última modificación: 7 Enero 2013, 20:04 pm por cyber33 » En línea

juancaa

Desconectado Desconectado

Mensajes: 140


[ Img^(Img) = Real ]


Ver Perfil
Re: Evitar bloqueo del metodo read() de un objeto Socket en java/j2me
« Respuesta #3 en: 12 Enero 2013, 01:31 am »

Fijate en que al aplicar el metodo readInt() lo que hago es leer un numero entero. Aqui te dejo la parte del codigo del servidor para que se envien los bytes:

Código
  1.    public void sendBytes (byte[] bytes) {
  2.        try {            
  3.            synchronized (dos) {
  4.                int start = 0, len = bytes.length;
  5.                if (len < 0) {
  6.                    throw new IllegalArgumentException("Negative length not allowed");
  7.                } if (start < 0 || start >= bytes.length) {
  8.                    throw new IndexOutOfBoundsException("Out of bounds: " + start);
  9.                }
  10.                dos.writeInt(len);
  11.                if (len > 0) { dos.write(bytes, start, len); }                    
  12.            }
  13.        } catch (IOException ex) { System.out.println("Error sending bytes"); }
  14.    }

Lo que hago es primero mandar el tamaño del array de bytes al cliente (numero entero), luego el cliente lee el tamaño del array y crea por tanto un array de ese tamaño (lineas 7 y 8 codigo 1) luego el servidor manda todo el array de bytes para que el cliente pueda leerlo mediante el metodo readFully(). El error que tu me comentabas se debe a que supongo no entendiste el funcionamiento del codigo que te puse y le mandaste directamente los bytes sin especificar antes el tamaño. Espero que ahora si lo hayas entendido  ;)
En línea

Que tengas un buen dia!
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[JAVA] ¿Cómo uso Timers en Java?(J2ME)
Java
zheo 3 12,604 Último mensaje 22 Enero 2005, 04:26 am
por zheo
¿Qué programa para programar en java J2ME?
Java
<-- krypton --> 3 5,105 Último mensaje 23 Junio 2007, 03:20 am
por coolfrog
Ayuda Metodo con Objeto como parametro....
Java
PAD_boy 2 3,212 Último mensaje 8 Octubre 2008, 00:56 am
por Ragnarok
Como evitar el salto de linea despues de READ
GNU/Linux
dato000 2 4,006 Último mensaje 20 Junio 2012, 09:23 am
por snhd6
Ayuda para que un metodo me devuelva un objeto
Java
rych 5 4,002 Último mensaje 2 Mayo 2016, 03:29 am
por + 1 Oculto(s)
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines