Autore Topic: [ANDROID] Server C/Client Android chat  (Letto 516 volte)

Offline enry2108

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 7 2012
  • Sistema operativo:
    Ubuntu 12.04, Windows 10
[ANDROID] Server C/Client Android chat
« il: 17 Agosto 2015, 12:23:35 CEST »
0
Salve, sto creando un App che faccia da client per una chat. Il Server è in C e non è modificabile.
Ora riesco a comunicare on il Server e a scambiare i messaggi, il problem è il seguente: 1° messaggio, tutto perfetto, poi per inviare i successivi devo sistematicamente premere il bottone 3 volte, invia 3 messaggi vuoti o riempiti in modo errato, e poi al 3 click del bottone il messaggio viene inviato senza problemi. Non riesco a capire dove possa essere l'errore, penso nello stream DataOutputStream o nel buffer che non vengono puliti correttamente.

posto il codice, potreste dargli un occhiata e darmi un parere? grazie!

P.S: spero di aver inserito il topic nella sezione giusta!

Codice (Java): [Seleziona]
package com.example.enrico.appprova3;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Message;
import android.os.Handler;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.nio.ByteBuffer;


public class MainActivity extends Activity {

    private static final String TAG = "PROVA";
    private Button btn_connect, btn_sendmsg, btn_login, btn_logout, btn_reg, btn_list;
    private static TextView chat;
    private EditText ip,porta,messa,nm_cg, mail, nick , dest;
    Socket socket = null;
    private static boolean flag = true;
    private static String acapo = "", IP, PORTA;
    DataInputStream dis = null;
    DataOutputStream dos = null;
    ByteBuffer buf = ByteBuffer.allocate(1517);

   //meccanismo per scambiare messaggi tra thread diversi
   //Serve per aggiungere una nuova linea alla chat
   static Handler handler = new Handler() {
       @Override
       public void handleMessage(Message msg) {
           if (flag) {
               acapo += msg.obj.toString() + "\r\n";
               chat.setText(acapo);
           }
       }
   };

    public class Msg{
        private String tipo;
        private String Mittente;
        private String Destinatario;
        private int lunghezza;
        private String mess;
    }

    public class Msg_rcv{
        private String tipo_rcv;
        private String mittente_rcv;
        private String destinatario_rcv;
        private String lunghezza_rcv;
        private String mess_rcv;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn_connect = (Button) findViewById(R.id.CONNETTI);
        btn_sendmsg = (Button) findViewById(R.id.INVIA);
        btn_login = (Button) findViewById(R.id.LOGIN);
        btn_logout = (Button) findViewById(R.id.LOGOUT);
        btn_reg = (Button) findViewById(R.id.REGISTRA);
        btn_list = (Button) findViewById(R.id.LISTA);
        chat = (TextView) findViewById(R.id.RISPOSTA);
        ip = (EditText) findViewById(R.id.IP);
        porta = (EditText) findViewById(R.id.PORTA);
        nm_cg = (EditText) findViewById(R.id.NOME_COGNOME);
        mail = (EditText) findViewById(R.id.MAIL);
        nick = (EditText) findViewById(R.id.NICKNAME);
        messa = (EditText) findViewById(R.id.MESSAGGIO);
        dest = (EditText) findViewById(R.id.DESTINATARIO);

        btn_connect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                //creazione del thread AsyncTask ed esecuzione
                if(socket!=null){
                    Toast.makeText(getApplicationContext(), "ERROR: Socket già creata", Toast.LENGTH_LONG).show();
                }else{
                    IP = ip.getText().toString();
                    PORTA = porta.getText().toString();
                    ClientAsyncTask clientAST = new ClientAsyncTask();
                    clientAST.execute();
                }
            }
        });

        //msg Single o Broadcast
        btn_sendmsg.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Log.d(TAG, "dest: " + dest);
                if (dest.equals(" ")){
                    Msg msg1 = new Msg();
                    msg1.tipo = "B";
                    msg1.Mittente = nick.getText().toString();
                    msg1.Destinatario = "";
                    msg1.mess = messa.getText().toString();
                    msg1.lunghezza = msg1.mess.length();
                    sendMessage(msg1);
                }
                else{
                    Msg msg2 = new Msg();
                    msg2.tipo = "S";
                    msg2.Mittente = nick.getText().toString();
                    msg2.Destinatario = dest.getText().toString();
                    msg2.mess = messa.getText().toString();
                    msg2.lunghezza = msg2.mess.length();
                    sendMessage(msg2);
                }
            }
        });

       //Registrazione
        btn_reg.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Msg msg3 = new Msg();
                msg3.tipo = "R";
                msg3.Mittente = "";
                msg3.Destinatario = "";
                msg3.mess = nick.getText().toString() + ":" + nm_cg.getText().toString() + ":" + mail.getText().toString();
                msg3.lunghezza = 0;
                sendMessage(msg3);
            }
        });

        //Login
        btn_login.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Msg msg4 = new Msg();
                msg4.tipo = "L";
                msg4.Mittente = "";
                msg4.Destinatario = "";
                msg4.mess = nick.getText().toString();
                msg4.lunghezza = 0;
                sendMessage(msg4);
            }
        });

        //Logout
        btn_logout.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                    Msg msg5 = new Msg();
                    msg5.tipo = "X";
                    msg5.Mittente = "";
                    msg5.Destinatario = "";
                    msg5.mess = "";
                    msg5.lunghezza = 0;
                    sendMessage(msg5);
            }
        });

        //Lista
        btn_list.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Msg msg6 = new Msg();
                msg6.tipo = "I";
                msg6.Mittente = "";
                msg6.Destinatario = "";
                msg6.mess = "";
                msg6.lunghezza = 0;
                sendMessage(msg6);
            }
        });
    }

    private class ClientAsyncTask extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... params) {
            // TODO Auto-generated method stub
            //Creazione della Socket
            try {

                socket = new Socket(IP, Integer.parseInt(PORTA));
                Log.d(TAG, "Socket:" + socket);
                MainActivity.handler.obtainMessage(0, 0, -1, "Connessione avvenuta con Successo!").sendToTarget();

                    dis = new DataInputStream(socket.getInputStream());
                    dos = new DataOutputStream(socket.getOutputStream());

                    Log.d(TAG, "in: " + dis);
                    byte[] buf1 = new byte[1517];
                    Log.d(TAG, "buf11: " + buf1);

                ByteBuffer bb = ByteBuffer.wrap(buf1);

                Log.d(TAG, "flag1: " + flag);
                    while(socket.isConnected()){
                        Log.d(TAG, "flag2: " + flag);

                        dis.read(buf1);
                        Log.d(TAG, "BUF11 : " + buf1);

                        Msg_rcv msg_rcv = new Msg_rcv();
                        Log.d(TAG, "Msg_rcv CREATO");


                        byte[] b = new byte[bb.remaining()];
                        Log.d(TAG, "ARRAY B: " + b);
                        bb.get(b);
                        Log.d(TAG, "BB1.GET(b): " + b);

                        msg_rcv.tipo_rcv = new String(b ,0,1);
                        Log.d(TAG, " msg_rcv.tipo_rcv: " +  msg_rcv.tipo_rcv );
                        msg_rcv.tipo_rcv = msg_rcv.tipo_rcv.replace('*', '\u0000');

                        msg_rcv.mittente_rcv = new String(b ,1,256);
                        Log.d(TAG, " msg_rcv.mittente_rcv: " +  msg_rcv.mittente_rcv );
                        msg_rcv.mittente_rcv = msg_rcv.mittente_rcv.replace('*', '\u0000');

                        msg_rcv.destinatario_rcv = new String(b ,257,256);
                        Log.d(TAG, " msg_rcv.destinatario_rcv: " +  msg_rcv.destinatario_rcv );
                        msg_rcv.destinatario_rcv = msg_rcv.destinatario_rcv.replace('*', '\u0000');

                        msg_rcv.lunghezza_rcv = new String(b ,513,4);
                        Log.d(TAG, " msg_rcv.lunghezza_rcv: " +  msg_rcv.lunghezza_rcv );
                        msg_rcv.lunghezza_rcv = msg_rcv.lunghezza_rcv.replace('*', '\u0000');

                        msg_rcv.mess_rcv = new String(b ,517,1000);
                        Log.d(TAG, " msg_rcv.mess_rcv: " +  msg_rcv.mess_rcv );
                        msg_rcv.mess_rcv = msg_rcv.mess_rcv.replace('*', '\u0000');

                        if (msg_rcv.tipo_rcv.equals("E")){
                            MainActivity.handler.obtainMessage(0, 0, -1, "Server ERROR: " + "tipo: " + msg_rcv.tipo_rcv + " mittente : " + msg_rcv.mittente_rcv + " destinatario: " + msg_rcv.destinatario_rcv + " lunghezza: " + msg_rcv.lunghezza_rcv + " messaggio: " + msg_rcv.mess_rcv).sendToTarget();
                         
                        }
                       else if(msg_rcv.tipo_rcv.equals("O")){
                        MainActivity.handler.obtainMessage(0, 0, -1, "Server OK: " + "tipo: " + msg_rcv.tipo_rcv + " mittente : " + msg_rcv.mittente_rcv + " destinatario: " + msg_rcv.destinatario_rcv + " lunghezza: " + msg_rcv.lunghezza_rcv + " messaggio: " + msg_rcv.mess_rcv).sendToTarget();
                        }
                        else if( msg_rcv.tipo_rcv.equals("S")){
                            MainActivity.handler.obtainMessage(0, 0, -1, "Server SINGLE: " + "tipo: " + msg_rcv.tipo_rcv + " mittente : " + msg_rcv.mittente_rcv + " destinatario: " + msg_rcv.destinatario_rcv + " lunghezza: " + msg_rcv.lunghezza_rcv + " messaggio: " + msg_rcv.mess_rcv).sendToTarget();
                        }
                        else if(msg_rcv.tipo_rcv.equals("B")){
                            MainActivity.handler.obtainMessage(0, 0, -1, "Server BROADCAST: " + "tipo: " + msg_rcv.tipo_rcv + " mittente : " + msg_rcv.mittente_rcv + " destinatario: " + msg_rcv.destinatario_rcv + " lunghezza: " + msg_rcv.lunghezza_rcv + " messaggio: " + msg_rcv.mess_rcv).sendToTarget();
                        }
                        else if(msg_rcv.tipo_rcv.equals("I")){
                            MainActivity.handler.obtainMessage(0, 0, -1, "Server LIST: " + "tipo: " + msg_rcv.tipo_rcv + " mittente : " + msg_rcv.mittente_rcv + " destinatario: " + msg_rcv.destinatario_rcv + " lunghezza: " + msg_rcv.lunghezza_rcv + " messaggio: " + msg_rcv.mess_rcv).sendToTarget();
                        }
                        else{
                            MainActivity.handler.obtainMessage(0, 0, -1, "nessun messaggio valido").sendToTarget();
                        }

                        bb.flip();
                        bb.clear();
                        Log.d(TAG, "PIENO: " + bb.hasRemaining());

                        buf.flip();
                        buf.clear();
                        dos.flush();
                    }

                dis.close();
                dos.close();
                Log.d(TAG, "USCITO WHILE");

                } catch (UnknownHostException e1) {
                e1.printStackTrace();
                Toast.makeText(getApplicationContext(), "Connessione Fallita", Toast.LENGTH_LONG).show();
                Log.d(TAG, "Connessione fallita");

            } catch (IOException e1) {
                e1.printStackTrace();
                Toast.makeText(getApplicationContext(), "Connessione Fallita: Socket non creata", Toast.LENGTH_LONG).show();
                Log.d(TAG, "Connessione Fallita: Socket non creata");
            }finally{
                if(socket != null){
                    try {
                        socket.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
            return null;


        }
    }


    void sendMessage(Msg msg) {
        try {
                MainActivity.handler.obtainMessage(0, 0, -1, "CLIENT: " + "tipo: " + msg.tipo + " mittente : " + msg.Mittente + " destinatario: " + msg.Destinatario + " lunghezza: " + msg.lunghezza + " messaggio: " + msg.mess).sendToTarget();

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

            byte[] baf = buf.array();
            Log.d(TAG, "baf1: " + baf);

                dos.write(baf);
                Log.d(TAG, "baf1: " + buf.array().toString());

                buf.flip();
                buf.clear();
                Log.d(TAG, "BUFF: " + buf);
                dos.flush();

        } catch (Exception ioException) {
            ioException.printStackTrace();
            Toast.makeText(getApplicationContext(), "Messaggio non Inviato!", Toast.LENGTH_LONG).show();
            Log.d(TAG, "Messaggio non Inviato!");
        }
    }
}

Post unito: 17 Agosto 2015, 15:28:49 CEST
Ho modificato la funzione nel seguente modo

Codice: [Seleziona]
void sendMessage(Msg msg) throws IOException {
        try {


                MainActivity.handler.obtainMessage(0, 0, -1, "CLIENT: " + "tipo: " + msg.tipo + " mittente : " + msg.Mittente + " destinatario: " + msg.Destinatario + " lunghezza: " + msg.lunghezza + " messaggio: " + msg.mess).sendToTarget();

                byte[] tipo = msg.tipo.getBytes();
                System.arraycopy(tipo, 0, bef, 0, tipo.length);

                byte[] mittente = msg.Mittente.getBytes();
                System.arraycopy(mittente, 0, bef, 1, mittente.length);

                byte[] destinatario = msg.Destinatario.getBytes();
                System.arraycopy(destinatario, 0, bef, 257, destinatario.length);

                bef[516] = (byte)msg.lunghezza;

                byte[] mess = msg.mess.getBytes();
                System.arraycopy(mess, 0, bef, 517, mess.length);


                dos.write(bef);
                Log.d(TAG, "bef2: " + bef);

        } catch (Exception ioException) {
            ioException.printStackTrace();
            Toast.makeText(getApplicationContext(), "Messaggio non Inviato!", Toast.LENGTH_LONG).show();
            Log.d(TAG, "Messaggio non Inviato!");
        }finally{
            if(dos!=null) {
                dos.flush();
                Toast.makeText(getApplicationContext(), "DOS flush", Toast.LENGTH_LONG).show();
            }
        }
    }

ogni volta che clicco sul tasto invia, mi compare il toast "DOS flush" quindi direi che esegue il comando.
Però continuo sempre ad aver bisogno di cliccare 3 volte il tasto invia per averlo corretto.

vedo bene il messaggio dal Server, dovrei ricevere:
[SERVER]: msg_rcv: MC.type:"83" Mc.sender:"max" Mc.receiver:"sara" Mc.mslen:"5" Mc.msg:"PROVA"

mentre invece ricevo (facendo 3 click sul pulsante):
[SERVER]: msg_rcv: MC.type:"0" Mc.sender:"" Mc.receiver:"Smax" Mc.mslen:"1" Mc.msg:"a"
[SERVER]: msg_rcv: MC.type:"0" Mc.sender:"" Mc.receiver:"" Mc.mslen:"0" Mc.msg:""
[SERVER]: msg_rcv: MC.type:"0" Mc.sender:"" Mc.receiver:"" Mc.mslen:"0" Mc.msg:""
[SERVER]: msg_rcv: MC.type:"83" Mc.sender:"max" Mc.receiver:"sara" Mc.mslen:"5" Mc.msg:"PROVA"

ribadisco che il primo messaggio non crea problemi. La funzione di lettura del server, funziona correttamente in quanto la utilizzo anche per il client C.
« Ultima modifica: 17 Agosto 2015, 15:28:49 CEST da enry2108, Reason: Merged DoublePost »