Domanda

Sto cercando di sviluppare un client TCP che gira su dispositivi mobili utilizzando MIDP 2.0 e CLDC 1.1. Sto cercando alcuni esempi di codice, e ho il seguente problema:

ottengo un'eccezione strano quando provo a leggere i dati indietro (Dal MIDlet).

Questo è il mio codice:

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

Questa è l'eccezione che ottengo:

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 linea che causa l'eccezione è questo:

firstByte = in.read();

sto leggendo su un thread separato. Ho sperimentato lo stesso errore quando ho inviato le richieste e ho cercato di leggerli utilizzando lo stesso server. Il server è un semplice server eco, niente di complesso.

P.S. So che il modo in cui il codice è scritto assomiglia a C #, ma è Java, trovo più facile da leggere e seguire in questo modo.

Grazie.

È stato utile?

Soluzione 2

In questo esempio sembra funzionare: http: //www.java-samples. com / J2ME / presa-connessione--J2ME-campione-program.htm

E 'possibile che il problema era che stavo attuazione del cliente come una classe denominata dal midlet?

Altri suggerimenti

La prima cosa che vedo è che si sta utilizzando mis-available(). E 'molto probabile che non fare ciò che si spera che fa.

available() restituisce una stima . La sua JavaDoc prosegue affermando esplicitamente questo:

  

Non è mai corretto usare il valore di ritorno di questo metodo per allocare un buffer destinato a contenere tutti i dati in questa corrente.

Si può benissimo tornare solo 0, nel qual caso si alloca un buffer di dimensione 0 e prova a leggere in quello.

In un conforme attuazione che dovrebbe semplicemente restituire immediatamente e non leggere nulla, ma si potrebbe facilmente innescare un bug in un'implementazione meno-che-perfetto in questo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top