[RISOLTO][JAVA] BufferByte posizione Byte

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Enry2108
Prode Principiante
Messaggi: 211
Iscrizione: venerdì 28 novembre 2008, 0:30
Località: Portomaggiore

[RISOLTO][JAVA] BufferByte posizione Byte

Messaggio da Enry2108 »

Salve, devo inviare tramite buffer una classe, ad un Server C che legge il buffer e la riposiziona in una struttura.

codice Java

Codice: Seleziona tutto

DataOutputStream os = new DataOutputStream(socket.getOutputStream());

                ByteBuffer buf = ByteBuffer.allocate(1520);

                buf.put(msg.tipo.getBytes()).position(0);               
                buf.put(msg.Mittente.getBytes()).position(4);              
                buf.put(msg.Destinatario.getBytes()).position(260);
                buf.put(msg.lunghezza.getBytes()).position(516);
                buf.put(msg.mess.getBytes()).position(520);
            
                byte[] baf = buf.array();           

                os.write(baf);
il messaggio è strutturato nel seguente modo:

Codice: Seleziona tutto

public class Msg{
        private String tipo;
        private String Mittente;
        private String Destinatario;
        private String lunghezza;
        private String mess;
    }
e rimpito:

Codice: Seleziona tutto

Msg msg1 = new Msg();
                msg1.tipo="L";
                msg1.Mittente ="";
                msg1.Destinatario="";
                msg1.mess= "max";
                msg1.lunghezza= String.valueOf(msg1.mess.length());
il server riceve:
[SERVER]: msg_rcv: Mc.type: "76" Mc.sender: "" Mc.Receiver: "" Mc.mslen: "109" Mc.msg: "ax"

ora io so che la struttura che riceve alloca:
Mc.type -> 4 Byte
Mc.sender -> 256 Byte
Mc.Receiver -> 256 Byte
Mc.mslen -> 4 Byte
Mc.msg -> 1000 Byte

Non capisco cosa sto sbagliando nella gestione delle posizioni in BufferByte. Qualcuno riesce a spiegarmi? Grazie
Ultima modifica di Enry2108 il martedì 12 maggio 2015, 16:14, modificato 3 volte in totale.
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: [JAVA] BufferByte posizione Byte

Messaggio da Zoff »

Non hai scritto cosa succede e qual'è il problema.

Immagino riguadi le posizioni dei byte. il metodo position() di ByBuffer imposta il puntatore corrente quindi:

Codice: Seleziona tutto

buf.put(msg.tipo.getBytes()).position(0);             //Scrive msg.tipo nel buffer poi riposiziona il puntatore all'inizio del buffer
buf.put(msg.Mittente.getBytes()).position(4);         //Scrive nella posizione correte (0) msg.Mittente quindi sovrascrive msg.tipo e posiziona il puntatore del buffer in posizione 4
buf.put(msg.Destinatario.getBytes()).position(260);   //Scrive nella posizione correte (4) msg.Destinatario quindi sorascrive msg.Mittente dal 5° byte in poi e posiziona il puntatore del buffer in posizione 260
buf.put(msg.lunghezza.getBytes()).position(516);      //Scrive nella posizione corrente (260) msg.lunghezza e posiziona il puntatore del buffer in posizione 516
buf.put(msg.mess.getBytes()).position(520);           //Scrive nella posizione corrente (516) msg.mess e posiziona inutilmente il puntatore del buffer in posizione 520
Suppongo che quello che intendevi fosse invece:

Codice: Seleziona tutto

buf.put(msg.tipo.getBytes()).position(4);
buf.put(msg.Mittente.getBytes()).position(260);       
buf.put(msg.Destinatario.getBytes()).position(516);
buf.put(msg.lunghezza.getBytes()).position(520);
buf.put(msg.mess.getBytes());
ma non ne sono certo.
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Enry2108
Prode Principiante
Messaggi: 211
Iscrizione: venerdì 28 novembre 2008, 0:30
Località: Portomaggiore

Re: [JAVA] BufferByte posizione Byte

Messaggio da Enry2108 »

Scusa hai ragione

la stampa che il SERVER è:
[SERVER]: msg_rcv: Mc.type: "76" Mc.sender: "" Mc.Receiver: "" Mc.mslen: "109" Mc.msg: "ax"

io voglio ottenere
[SERVER]: msg_rcv: Mc.type: "76" Mc.sender: "" Mc.Receiver: "" Mc.mslen: "51" Mc.msg: "max"

ora provo a sistemare come mi hai detto tu, non avevo bene capito come si riposizionava il puntatore. Grazie
Enry2108
Prode Principiante
Messaggi: 211
Iscrizione: venerdì 28 novembre 2008, 0:30
Località: Portomaggiore

Re: [JAVA] BufferByte posizione Byte

Messaggio da Enry2108 »

Mandando il seguente messaggio:

Codice: Seleziona tutto

   Msg msg1 = new Msg();
                msg1.tipo="L";
                msg1.Mittente ="io";
                msg1.Destinatario="tu";
                msg1.mess= "max";
                msg1.lunghezza= String.valueOf(msg1.mess.length());
sistemando la posizione dei Byte come suggerito sopra ottengo:
[SERVER]: msg_rcv: Mc.type: "76" Mc.sender: "" Mc.Receiver: "" Mc.mslen: "51" Mc.msg: ""

non capisco coma mai non mi compaiono le stringhe. i byte ora dovrebbero essere a posto
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: [JAVA] BufferByte posizione Byte

Messaggio da Zoff »

Forse dovresti postare il codice che legge i dati.

Quel 76 in Type corrisponde al codice ASCII di "L" e il 51 in msglen è il codice ASCII di "3"
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Enry2108
Prode Principiante
Messaggi: 211
Iscrizione: venerdì 28 novembre 2008, 0:30
Località: Portomaggiore

Re: [JAVA] BufferByte posizione Byte

Messaggio da Enry2108 »

quella parte va bene, il server si aspetta il numero in ASCII

ora ho provato a spostare i byte in questo modo:

Codice: Seleziona tutto

    buf.put(msg.tipo.getBytes()).position(1);        
                buf.put(msg.Mittente.getBytes()).position(260);           
                buf.put(msg.Destinatario.getBytes()).position(516);                
                buf.put(msg.lunghezza.getBytes()).position(517);                
                buf.put(msg.mess.getBytes()).position();
                
ed ho ottenuto:
[SERVER]: msg_rcv: Mc.type: "76" Mc.sender: "io" Mc.Receiver: "" Mc.mslen: "51" Mc.msg: "max"

devo arrivare ad avere:
[SERVER]: msg_rcv: Mc.type: "76" Mc.sender: "io" Mc.Receiver: "tu" Mc.mslen: "51" Mc.msg: "max"

forse sto contando male i byte, ma allora non mi spiego perchè la parte finale viene ricevuta correttamente
Enry2108
Prode Principiante
Messaggi: 211
Iscrizione: venerdì 28 novembre 2008, 0:30
Località: Portomaggiore

Re: [RISOLTO][JAVA] BufferByte posizione Byte

Messaggio da Enry2108 »

Risolto, era una questione di byte:

Codice: Seleziona tutto

buf.put(msg.tipo.getBytes()).position(1);
                Log.d(TAG, "buf1: " + buf);
                buf.put(msg.Mittente.getBytes()).position(257);
                Log.d(TAG, "buf2: " + buf);
                buf.put(msg.Destinatario.getBytes()).position(516);
                Log.d(TAG, "buf3: " + buf);
                buf.put((byte) msg.lunghezza).position(517);
                Log.d(TAG, "buf4: " + buf);
                buf.put(msg.mess.getBytes()).position();
                Log.d(TAG, "buf5: " + buf);
grazie dell'aiuto per il funzionamento di .posizione()
Enry2108
Prode Principiante
Messaggi: 211
Iscrizione: venerdì 28 novembre 2008, 0:30
Località: Portomaggiore

Re: [Risolto][JAVA] BufferByte posizione Byte

Messaggio da Enry2108 »

Ora sto cercando di leggere dal Buffer

Codice: Seleziona tutto

   byte[] buf = new byte[2000];
                    DataInputStream in = new DataInputStream(socket.getInputStream());               
       
                    while(flag){                
                        in.read(buf);                  
                        ByteBuffer baf = ByteBuffer.wrap(buf);                 
                        Msg msg = new Msg();                    
                        baf.get(msg.tipo.getBytes()).position(1);                     
                        MainActivity.handler.obtainMessage(0, 0, -1, "Server: " + msg.tipo.getBytes().toString()).sendToTarget();           

                        in.close();
                        socket.close();

                    }
il codice mi si ferma all'esecuzione di:

Codice: Seleziona tutto

baf.get(msg.tipo.getBytes()).position(1);    
non capisco il perchè. In questo modo sto leggendo il buffer e sto sto mettendo il suo contenuto all'interno di msg.tipo no?

grazie
Enry2108
Prode Principiante
Messaggi: 211
Iscrizione: venerdì 28 novembre 2008, 0:30
Località: Portomaggiore

Re: [JAVA] BufferByte posizione Byte

Messaggio da Enry2108 »

Questo è il codice d'errore che mi da:

Codice: Seleziona tutto

05-12 04:16:26.600    1811-1825/com.example.enrico.appprova3 E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #2
    Process: com.example.enrico.appprova3, PID: 1811
    java.lang.RuntimeException: An error occured while executing doInBackground()
            at android.os.AsyncTask$3.done(AsyncTask.java:300)
            at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
            at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
            at java.util.concurrent.FutureTask.run(FutureTask.java:242)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:841)
     Caused by: java.lang.NullPointerException
            at com.example.enrico.appprova3.MainActivity$ClientAsyncTask.doInBackground(MainActivity.java:125)
            at com.example.enrico.appprova3.MainActivity$ClientAsyncTask.doInBackground(MainActivity.java:92)
            at android.os.AsyncTask$2.call(AsyncTask.java:288)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:841)
nessuno riesce a spiegarmi come mai non mi esegue quella riga di codice? Grazie
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti