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.
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.