Pregunta

Estoy tratando de desarrollar un cliente TCP que se ejecuta en dispositivos móviles que utilizan MIDP 2.0 y CLDC 1.1. Estoy tratando algunos ejemplos de código, y tengo el siguiente problema:

recibo una excepción rara cuando trato de leer la parte de atrás de datos (desde el MIDlet).

Este es mi código:

            //Wait for an incoming message
            firstByte = in.read();
            ByteArrayOutputStream textRecieved = new ByteArrayOutputStream();   //Will be used to hold the data
            if (firstByte >= 0 )
            {                    
                int messageSize = this.in.available();

                //Read the message
                while (messageSize > 0)
                {
                    byte[] buffer = new byte[messageSize];  
                    this.in.read(buffer);
                    textRecieved.write(buffer);
                    messageSize = this.in.available();   //Just in case the server sent the request in chunks.
                    System.out.println("Reading...");
                }
            }
            textRecieved.close();

Esta es la excepción consigo:

java.io.IOException: Unknown error 10053 during socket::read 
        at com.sun.midp.io.j2me.socket.Protocol.read0(), bci=0
        at com.sun.midp.io.j2me.socket.Protocol.nonBufferedRead(), bci=12
        at com.sun.midp.io.BufferedConnectionAdapter.readBytes(), bci=36
        at com.sun.midp.io.BaseInputStream.read(), bci=227
        at com.sun.midp.io.BufferedInputStream.fill(), bci=172
        at com.sun.midp.io.BufferedInputStream.read(), bci=16
        at hello.Client.run22222(Client.java:60)
        at hello.HelloMIDlet.startApp(HelloMIDlet.java:193)
        at javax.microedition.midlet.MIDletTunnelImpl.callStartApp(), bci=1
        at com.sun.midp.midlet.MIDletPeer.startApp(), bci=7
        at com.sun.midp.midlet.MIDletStateHandler.startSuite(), bci=269
        at com.sun.midp.main.AbstractMIDletSuiteLoader.startSuite(), bci=52
        at com.sun.midp.main.CldcMIDletSuiteLoader.startSuite(), bci=8
        at com.sun.midp.main.AbstractMIDletSuiteLoader.runMIDletSuite(), bci=161
        at com.sun.midp.main.AppIsolateMIDletSuiteLoader.main(), bci=26

La línea que hace que la excepción es la siguiente:

firstByte = in.read();

Estoy leyendo en un hilo separado. He experimentado el mismo error cuando envié solicitudes y trató de leerlos utilizando el mismo servidor. El servidor es un servidor simple eco, nada complejo.

P.S. Sé que la forma en que el código está escrito miradas como C #, Java, pero es, me resulta más fácil de leer y seguir de esta manera.

Gracias.

¿Fue útil?

Solución 2

Este ejemplo parece estar funcionando: http: //www.java-samples. com / J2ME / socket-conexión-libre de J2ME-muestra-program.htm

¿Es posible que el problema era que yo estaba ejecutando el cliente como una clase llamada por el MIDlet?

Otros consejos

Lo primero que veo es que usted está usando mis-available(). Es más probable no hace lo que se espera que lo hace.

available() devuelve una estimación . Su JavaDoc pasa a indicar explícitamente lo siguiente:

  

Nunca es correcto usar el valor de retorno de este método para asignar un almacenamiento intermedio destinado a contener todos los datos en esta corriente.

Puede muy bien acaba de regresar 0, en cuyo caso se puede asignar un buffer de tamaño 0 y trata de leer en eso.

En una implementación conforme que acaba de leer debe devolver inmediatamente y no cualquier cosa, pero fácilmente se podría desencadenar un error en una aplicación menos-que-perfecta con eso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top