Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - cyber33

#1
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.
#2
Java / Re: conexion http en j2me
4 Enero 2013, 00:44 AM
Hola de nuevo. Pues solo movi algunas lineas. Con eso deberias poder escribir. Una pregunta. El archivo ya existe no? No te sale algun error con el siguiente codigo?

Código (java) [Seleccionar]

public void escribir(){
       HttpConnection con=null;
       OutputStream os=null;
       PrintStream ps=null;
       try {
           alert.setString("escribe");
           pantalla.setCurrent(alert,pantalla_imprimir);
           System.err.println("tc escribir");
           con = (HttpConnection) Connector.open("http://127.0.0.1/noticia.txt");
           os = con.openOutputStream();
           ps = new PrintStream(os);
           ps.println("Hola que hace?");
           os.flush();
           ps.close();
           con.close();
       } catch (Exception ex) {
           alert.setString(ex.getMessage());
       }
       
   }



Saludos.[/color]
#3
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 (java) [Seleccionar]

  public void proceso(){
              try {
                  int d=is.available();
                  if(d!=0){
                      byte[] bytes=new byte[d];
                      int offset=0;
                      while(offset<bytes.length){
                          int value=is.read(bytes,offset, d);
                          if(value==-1)break;
                          offset+=value;
                      }
                      int i=0;
                      while(i<bytes.length){
                          System.out.print((char)bytes[i]);
                          i++;
                      }
                  }           
              } catch (IOException ex) {
              }
  }


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

Código (java) [Seleccionar]

public void proceso1(){
        try {
            int d=is.read();
            while(d!=-1){
                System.out.println((char)d);
                d=is.read();       
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
  }

Una forma mas eficiente de esto para leer que hize fue leer con el metodo read(byte[],position,length). Pero aún se bloquea.


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]
#4
Java / Re: conexion http en j2me
3 Enero 2013, 05:01 AM
Hola. En tu codigo veo que tienes invertidas las siguentes lineas:

con.close();
os.flush();

Debe ser de la siguiente manera:

  os.flush();
  con.close();
         
Estabas cerrando el flujo stream. Es por eso que te salia ese error.

Saludos.
#5
Hola a todos, actualmente estoy intentando crearme un chat para dispositivos mobiles. Pero también la duda que tengo se extiende a chat creados en java, c#, para desarrollo web, etc. Voy a intentar explicar lo mas claro posible. Me tiene un poco desesperado esta duda. Supongamos por ejemplo en el chat de skype para mobiles los mensajes que se envian a otro contacto se muestran  todos los mensajes que se enviaron los dos contactos. Aqui me surje la duda de como se hace para que no ocupe tanta memoria. Porque pensando logicamente no creo que todos los mensajes esten cargados al mismo tiempo en la memoria porque ocuparia bastante memoria. Lo mismo ocurre cuando queremos ver en el historial, se muestran por ejemplo 5 mensajes en la pantalla y si queremos ver mas apretamos un boton para que nos muestre por ejemplo unos 6 mensajes mas y asi sucesivamente. Sin embargo los 5+6=11 mensajes estaran cargados en memoria? o es que los 5 primeros se van al almacenamiento interno del mobil ( seria como el disco rigido del mobil o una tarjeta SD externa). O bien tomo otro ejemplo, que seguro lo conocen. El chat de facebook y su historial. En el chat de facebook cuando escribimos una cierta cantidad de mensajes y queremos volver mas arriba no nos deja subir y ahi pienso que se muestra una cantidad cierta de mensajes porque los demas anteriores no los podemos ver. Para verlos todos hay que ir al historial. Ahora bien, si nos vamos al historial, a primera vista se muestra por decir un número 10 mensajes, queremos ver más (el scroll bar dice que hay mas mensajes) y entonces subimos hacia arriba y dice que hay 2500 mensajes y que los esta cargando, y en ese momento carga por decir 12 mensajes nuevos y asi sucesivamente. Pero si bajamos hacia abajo vemos que tenemos cargado los 10+12=22 mensajes que fuimos viendo y ya no dice que esta cargando. Esto da a entender que estan cargados en memoria supuestamente.

En conclusión como se hace para que no se sobrecarge la memoria en un chat con los mensajes. Hay que guardar los mensajes en el disco (o tarjeta externa SD en caso de mobil) para que lo vayamos recuperando a medida que lo solicite el usuario? y los que ya leyo y quiere leer otros , los volvemos a disco y le mostramos lo que el solicito al ultimo en la interface?

Espero haber sido lo mas claro posible. Cualquier sugerencia me sera de mucha ayuda. Algunas recomendaciones o recursos que pueda usar.

Gracias.

Saludos.