Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2012
    Messaggi
    25

    Problema socket e ObjectOutputStream

    Salve a tutti.
    Sto tentando di realizzare una piccola macchinina costruita con Arduino +WIFI SHIELD sulla quale girerà un piccolo Server che riceverà dei caratteri e a seconda del carattere letto attiverà i motori che a loro volta faranno muovere l'automobile avanti o indietro, a destra o a sinistra...
    I comandi verranno inviati da un programma scritto in java (che implementerà il socket e che chiaramente farà da client) che avrà una piccola interfaccia grafica con 5 tasti (AVANTI, INDIETRO, SINISTRA, DESTRA e STOP).

    Tutto pronto...ora però ho riscontrato un piccolissimo problema che pur essendo appunto piccolo mi sta facendo girare la testa da qualche giorno...

    Io invio correttamente il mio dato da JAVA...il problema è che usando la classe ObjectOutputStream e inviandolo come oggetto lui me lo "infiocchetta con tanti dati relativi all'oggetto"...non so se mi sono spiegato.
    All'arrivo il mio dato char è una serie di "cose" che non hanno nulla a che fare con la lettera che io dovevo inviare per far andare avanti la macchinina per esempio.
    Ho provato ad inviare tanti tipi di dato come byte, int ecc ma niente...

    Inoltre, il problema principale sembra essere la seguente stringa: oos = new ObjectOutputStream(socket.getOutputStream());
    tenendo presente che oos è di tipo ObjectOutputStream;
    In sostanza io ora devo capire come mandare e far ricevere solo il mio dato primitivo char!

    Grazie mille per l'attenzione...spero possiate darmi una dritta!
    In allegato il codice java
    File allegati File allegati

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da MET1515 Visualizza il messaggio
    il problema è che usando la classe ObjectOutputStream e inviandolo come oggetto lui me lo "infiocchetta con tanti dati relativi all'oggetto"...non so se mi sono spiegato.
    ObjectOutputStream per la scrittura su un socket va bene se dall' "altra parte" c'è un'altra applicazione Java che usa al contrario, ObjectInputStream. Visto che dall'altra parte c'è Arduino (nulla di Java quindi), ObjectOutputStream ovviamente non ha senso.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Infatti... ObjectOutputStream non è l'oggetto da usare per queste cose: ObjectOutputStream serve a "serializzare" gli oggetti (mettendoci tutte le informazioni necessarie affinchè dall'altra parte un altro ricevitore java possa ricostruire l'oggetto).

    Se tu devi inviare dei byte crudi, non devi assolutamente usare ObjectOutputStream: usa più semplicemente l'OutputStream ottenuto dalla socket ed i relativi metodi write().

    Esempio:

    codice:
    // Ottengo l'OutputStream dalla Socket:
    OutputStream os = socket.getOutputStream();
    
    // Invio un array di byte crudi:
    byte[] mioArray = ...;
    oos.write( mioArray );
    oos.flush();

    Puoi anche usare le altre varianti di write() se, ad esempio, devi inviare un solo byte o una parte di un array.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2012
    Messaggi
    25
    Grazie mille per la risposta...ma ancora non riesco a capire una cosa...potresti darmi una mano postando il codice per inviare un carattere o un byte contenete la codifica ASCII di una 'a' minuscola? Grazie mille perchè io ho già provato come hai detto ma non ho ottenuto alcun miglioramento ...

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    codice:
    OutputStream os = socket.getOutputStream();
    os.write((int) 'a');
    os.flush();
    
    // O, alternativamente (equivalente)
    os.write( 97 );
    os.flush();

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2012
    Messaggi
    25
    Grazie mille spero di riuscire a far funzionare la mia automobilina!
    Comunque potreste guardare questa pagina e dirmi cosa ne pensate? LINK
    grazie mille ancora!

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    codice:
    os.write((int) 'a');
    Scusa LeleFT, aggiungo solo che il cast a int non è nemmeno necessario. Questo write riceve un int e considera solo gli 8 bit bassi del valore.
    Chiaramente (lo dico per MET1515), con un OutputStream che tratta solo byte e non "sa" nulla di caratteri, non è possibile esprimere tutti i caratteri Unicode. Al massimo solo quelli ASCII, per cui 'a' è appunto ok.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.