Newsgroup: it.comp.java
Titolo: j2me: Aiuto! classCastException.

Ho bisogno di un aiuto immediato. Sto impazzendo da ore.
Ho letto da più parti che il modo giusto per aprire una connessione in una
midlet è:
HttpConnection http = null;
http = (HttpConnection) Connector (URL);
Ovviamente URL è una stringa con l'indirizzo del destinatario. Poi andranno
fatte tutte le operazioni con gli input buffer e gli output buffer.
Il mio problema è che ogni volta che la midlet invoca il metodo che contiene
queste righe di codice, arrivato ad eseguire http = (HttpConnection)
Connector (URL); mi dà sempre un ClassCastException!!! non so proprio cosa
fare!
Cosa ho dimenticato? atemi una mano, per favore, sto impazzendo...

> http = (HttpConnection) Connector (URL);
Vi chiedo scusa, ovviamente intendevo http = (HttpConnection)
Connector.open(URL);
Il problema rimane, è stato un errore di distrazione (o di isterismo?) fatto
al momento della scrittura del post.
ripeto: AIUTOOO!!!

 ripeto: AIUTOOO!!!
Il tuo pezzo di codice sembra, o meglio, č corretto, per scrupolo ho
guardato sul javadoc e ti posto questo esempio:
void postViaHttpConnection(String url) throws IOException {
        HttpConnection c = null;
        InputStream is = null;
        OutputStream os = null;
        try {
            c = (HttpConnection)Connector.open(url);
            // Set the request method and headers
            c.setRequestMethod(HttpConnection.POST);
            c.setRequestProperty("If-Modified-Since",
                "29 Oct 1999 19:43:31 GMT");
            c.setRequestProperty("User-Agent",
                "Profile/MIDP-1.0 Configuration/CLDC-1.0");
            c.setRequestProperty("Content-Language", "en-US");
            // Getting the output stream may flush the headers
            os = c.openOutputStream();
            os.write("LIST games\n".getBytes());
            os.flush();                // Optional, openInputStream will
flush
            // Opening the InputStream will open the connection
            // and read the HTTP headers. They are stored until
            // requested.
            is = c.openInputStream();
            // Get the ContentType
            String type = c.getType();
            processType(type);
            // Get the length and process the data
            int len = (int)c.getLength();
            if (len > 0) {
                byte[] data = new byte[len];
                int actual = is.read(data);
                process(data);
            } else {
                int ch;
                while ((ch = is.read()) != -1) {
                    process((byte)ch);
                }
            }
        } finally {
            if (is != null)
                is.close();
            if (os != null)
                os.close();
            if (c != null)
                c.close();
        }
    }
Scusa la domanda idiota :), ma sei sicuro che l'eccezione la generi quella
chiamata?
Posta magari + info che puoi, tipo cellulare, ed eventualmente piu' codice.
Potrebbe essere che la jvm che utilizzi nn supporti la connessione http,
quindi nn puoi castare a httpconnection.......
-- 
Ciao e buon lavoro,
  Renato
---- 
Renato Eschini
   Inera srl
   Via Vespucci 41
   56100 Pisa
   Tel:         (+39) (0)50 2201218
   WWW:         
http://www.inera.it

 quindi nn puoi castare a httpconnection.......
Se l'errore me lo avesse dato su un cellulare avrei pensato anche io la
stessa cosa, ma l'errore me lo dà sull'emulatore incluso nel j2me Wireless
Toolkit! Non so che dirti, posso anche postare più codice, ma non so a
quanto servirebbe, visto che evidentemente l'errore è generato li'. bho,
forse devo reinstallare j2me e jdk?

[...]
Ecco una porzione un po' più ampia di codice:
    Socketto = Socketto.concat(SMTP);
    Socketto = Socketto.concat(Port);
    System.out.println("1\n");
    connessione = (HttpConnection) Connector.open(Socketto);
    System.out.println("2\n");
    input = connessione.openInputStream();
    while((h=(char)input.read())!='\n')
     rcvBuffer.append(h);
    System.out.println("\nRicevuto:" +rcvBuffer.toString());
    input.close();
Non badare al nome delle variabili, non ho mai avuto molta fantasia :)
Ovviamente SMTP è un indirizzo smtp, e Port è una stringa del tipo ":25",
compresi i ":", che rappresenta la porta.
Il compilatore compila tutto per bene, l'emulatore avvia la midlet, ma nel
momento in cui chiamo il metodo che contiene questa porzione di codice, mi
stampa "1", e poi mi da' l'errore. Non stampa ne' il "2", ne' tantomeno il
rcvBuffer.

Non so se ha importanza, ma l'indirizzo chiamato è del tipo:
"sockett://
192.168.157.1:25
"
E scusatemi tanto per tutti questi post di seguito, ma dimentico sempre
qualcosa....
Grazie ancora.

 errore e l'esecuzione si blocca.
[CUT]
protected void startApp() throws MIDletStateChangeException {
        HttpConnection http = null;
        try {
            http = (HttpConnection) Connector.open("
http://localhost:8080
");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("FATTO");
}
In startApp ho messo il pezzo di codice che hai postato tu e a me funziona,
mi stampa FATTO e nn vengono generate eccezioni.
Pero'...:D....controlla la tua String URL, la puoi postare?
Perchè se metto http = (HttpConnection)
Connector.open("datagram://localhost:8080"); indovina che succede? :)
(datagram lo messo per test, puoi aver malformato in qualche modo la url)
Running with storage root DefaultColorPhone
    startApp threw an Exception
    java.lang.ClassCastException
    java.lang.ClassCastException
         at Test.startApp(+7)
         at javax.microedition.midlet.MIDletProxy.startApp(+7)
         at com.sun.midp.midlet.Scheduler.schedule(+266)
         at com.sun.midp.main.Main.runLocalClass(+28)
         at com.sun.midp.main.Main.main(+116)
questo perche' Connector nn è altro che una classe factory che ti ritorna
l'implementazione tramite .open l interfaccia Connection poi sta a te
castarla adeguatamanete, il factory immagino funzioni analizzando la url e
ritornandoti la giusta implementazione, nel tuo caso HttpConnection.
Fammi sapere....;-)


 ha scritto nel messaggio
news:SojVc.125623$OR2.6...@news3.tin.it...

Era proprio il dettaglio mancante :D:D:D, leggi il mio post sopra :D.
Ciauz...


 Ciauz...
Che tu ci creda o no, mi ero talmente impuntato che ero riuscito a trovarlo
da solo l'inghippo :)
Mi sono letto tutta la documentazione riguardo Connection, Connector,
HttpConnection, e tutte le classi che erano citate nelle pagine di
documentazione. E cosě, mi sono imbattuto in una SocketConnection, che mi ha
fatto capire il mio errore :)
Perň adesso ho un altro problema (e te pareva...).
Ora non mi da' piů l'exception sul cast, ma non so perchč, non invia dati.
Il codice incriminato č:
    Socketto = Socketto.concat(SMTP);
    Socketto = Socketto.concat(Port);
    connessione = (SocketConnection)Connector.open(Socketto); //Ovviamente
connessione č di tipo SocketConnection
    input = connessione.openInputStream();
    while((h=(char)input.read())!='\n')
     rcvBuffer.append(h);
    System.out.println("\nRicevuto:" +rcvBuffer.toString());
    output = connessione.openOutputStream();
    output.write(Helo.getBytes());
La console mi stampa il messaggio di benvenuto, ma il server non riceve
subito dopo (come avrei immaginato) l' "HELO" che ho scritto
nell'OutputStream.
P.S. Scusa se ti stresso cosě tanto, ma sto imparando un mucchio di nuove
cose, e non vedo l'ora di metterle in pratica :)
Grazie di tutto.

 cose, e non vedo l'ora di metterle in pratica :)
L'unica cosa che mi stressa č il lavoro ora come ora
:((((((((((((((((((((((((((((.


 trovi tutti i dettagli sul suo utilizzo nel javadoc ;)
Sembrava un buon suggerimento, ma purtroppo anche con il flush continua a
non funzionare... mah

Ho riscritto una mini-midlet autosufficente in cui si ripete lo stesso
problema, te la incollo qui sotto:
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.io.*;
import javax.microedition.rms.*;
import java.io.InputStream;
import javax.microedition.io.*;
import java.io.IOException;
import java.io.InputStream;
import java.lang.Thread;
public class schifo extends MIDlet
{
 private String stringa = "Prova";
 private SocketConnection connessione = null;
 private DataInputStream is = null;
 private DataOutputStream os = null;
 private StringBuffer rcvBuffer;
 public void startApp()
 {
  int h = 0;
  rcvBuffer = new StringBuffer();
  rcvBuffer.ensureCapacity(100);
  try
  {
   connessione =
(SocketConnection)Connector.open("socket://
192.168.157.1:21
");
   is = connessione.openDataInputStream();
   os = connessione.openDataOutputStream();
   while(((char)h)!='\n')
   {
    h = is.read();
    rcvBuffer.append((char)h);
   }
   System.out.println(rcvBuffer.toString());
   os.write(stringa.getBytes(), 0, stringa.length());
   os.flush();
   is.close();
   os.close();
   connessione.close();
  }
  catch (Exception e)
  {
   System.err.println(e.toString());
  }
 }
L'ho testata sull'ftp server, che riceve la chiamata, e invia il messaggio
di benvenuto. La midlet mi stampa il messaggio di benveuto dell'ftp server e
poi, invece di mandare la tringa "Prova", si blocca.

 problema, te la incollo qui sotto:
[CRUNCH]
Scusa nn avevo letto che nn ti aveva funzionato il flush, appena ho due
minuti faccio un test con il codice che ai postato.


 dell'ftp server e poi, invece di mandare la tringa "Prova", si blocca. 
Non ho guardato bene il codice, ma potrebbe essere il solito problema:
la stringa deve finire con \r\n - mentre tu usi println() che usa il
line.separator di default della piattaforma. Usa print() e scrivi
esplicitamente i terminatori di linea. 

 problema, te la incollo qui sotto:
[CRACK]
Sotto ho messo il codice che ho provato, sia sul mail server sia con il
socket tester Castalia in locale sul mio pc di sviluppo e ha funzionato, nn
capisco che problemi tu abbia!
Ho aggiunto semplicemente i sysout con gli step per vedere eventualmente
dove si bloccava ma nn ho avuto problemi.
L'unica nota è questa :
os.write(stringa.getBytes(), 0, stringa.getBytes().length);
invece che
os.write(stringa.getBytes(), 0, stringa.lenght());
devi passare il numero dei byte nn dei caratteri, formalmente è piu'
corretta la seconda chiamata.
public void startApp()
    {
        int h = 0;
        rcvBuffer = new StringBuffer();
        rcvBuffer.ensureCapacity(100);
        try
        {
            connessione =
(SocketConnection)Connector.open("socket://localhost:9000");
            is = connessione.openDataInputStream();
            os = connessione.openDataOutputStream();
            while(((char)h)!='\n')
            {
                h = is.read();
                rcvBuffer.append((char)h);
            }
            System.out.println(rcvBuffer.toString());
            os.write(stringa.getBytes(), 0, stringa.getBytes().length);
            System.out.println("step 1");
            os.flush();
            System.out.println("step 1");
            is.close();
            System.out.println("step 1");
            os.close();
            System.out.println("step 1");
            connessione.close();
            System.out.println("the end");
        }
        catch (Exception e)
        {
            System.err.println(e.toString());


             System.out.println("the end");
Metti numeri progressivi naturalmente, scusa ma oggi sono proprio in-fusione
:S :)


 :S :)
Figurati, capita a tutti, è la sindrome del copia-incolla :)
Cma, il codice che mi hai dato tu non si blocca, ma il problema persiste
anche in quello. Cioè sul server in ascolto io non vedo ricevuta la stringa
trasmessa dalla midlet. E ciò implica che il server non risponde al comando,
e quindi il programma completo che stavo sviluppando si blocca a quel punto.
L'email server non mi risponde all'helo (perchè non lo riceve), l'ftp non
risponde allo USER tizio, ecc, ecc.
Se però da te funziona, forse è un difetto del mio software, toolkit, jdk o
forse anche solo emulatore. BOOO