Question

Je suis en train de développer un client TCP qui fonctionne sur les appareils mobiles utilisant MIDP 2.0 et CLDC 1.1. J'essaie quelques exemples de code, et j'ai le problème suivant:

Je reçois une exception bizarre lorsque je tente de relire les données (De l'MIDlet).

Ceci est mon code:

            //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();

Ceci est l'exception que je reçois:

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 ligne qui fait l'exception est la suivante:

firstByte = in.read();

Je suis en train de lire sur un thread séparé. J'ai vécu la même erreur quand j'ai envoyé des demandes et a essayé de les lire en utilisant le même serveur. Le serveur est un simple serveur d'écho, rien de complexe.

P.S. Je sais que la façon dont le code est écrit en C # ressemble, mais il est Java, je trouve plus facile à lire et à suivre cette voie.

Merci.

Était-ce utile?

La solution 2

Cet exemple semble fonctionner: http: //www.java-samples. com / J2ME / douille libre-connection-j2me-sample-program.htm

Se pourrait-il que le problème était que j'exécutait le client en tant que classe appelée par le midlet?

Autres conseils

La première chose que je vois est que vous êtes mal à l'aide available(). Il est fort probable ne pas faire ce que vous espérez qu'il fait.

available() retourne une estimation . Son JavaDoc poursuit en disant explicitement ceci:

  

Il est jamais correct d'utiliser la valeur de retour de cette méthode pour allouer un tampon destiné à contenir toutes les données dans ce flux.

Il peut très bien revenir juste 0, auquel cas vous allouez un buffer de taille 0 et essayez de lire dans ce.

Dans une mise en œuvre conforme qui devrait simplement revenir immédiatement et ne pas lire quoi que ce soit, mais vous pouvez facilement déclencher un bogue dans une implémentation moins-que-parfait avec cela.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top