Autore Topic: Problema Socket  (Letto 584 volte)

Offline leo87

  • Nuovo arrivato
  • *
  • Post: 33
  • Respect: +1
    • Mostra profilo
  • Sistema operativo:
    windows 8
Problema Socket
« il: 05 Giugno 2013, 20:11:44 CEST »
0
Non riesco a trovare l'errore di questo semplice scambio di informazioni fra un server ed un'app android. La cosa strana è che l'app riesce ad inviare i primi dati al server, poi però il server risponde con la stringa "false" e l'app non riesce a memorizzarla....perchè????

App
Codice (Java): [Seleziona]
public class MainActivity extends Activity{
        private Button buttonLogin;
        private String user;
        private String pass;
       
        @Override
            protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       
        View.OnClickListener gestore2 = new View.OnClickListener() {
            public void onClick(View view) {
                    switch(view.getId()){
                    case R.id.button2:
                        if(autentificazione()){
              //fai qualcosa
                       
                        }
         
                     break;
                    }      
            }
        };
    //faccio partire il button login
    Button a1=(Button)findViewById(R.id.button2);
    a1.setOnClickListener(gestore2);
       

        }


    public boolean autentificazione(){
       
          user="";
          pass="";
         
         
                  Connect client = new Connect(user,pass);
                  Thread cThread = new Thread(client);
                  cThread.start();
               
                  boolean ret=client.auter();
                 
//mi stampa sempre true
                  TextView tv=(TextView)findViewById(R.id.textView1);      
                tv.setText("ProvaStringa:"+ret+"\n");
               
                  return ret;
    }
   
 

connect
Codice (Java): [Seleziona]
        public class Connect implements Runnable {

                private String ret="true";
                private Message msg;
                private String str;
                private String user;
                private String password;
               
               
                public Connect(String u,String p) {
                        user=u;
                        password=p;
                }


                public void run() {
                        try {

                                InetAddress serverAddr = InetAddress.getByName("10.0.2.2");
                               
                                Socket socket = new Socket(serverAddr, 51000);
                               
                                //pooi devo inviare user e pasqw
                                String message = user+" "+password;
                       
                       
                                        PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);
                                        out.println(message);
       
                                       
                                        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                                        ret = in.readLine();
               
                                        socket.close();
                               
                        } catch (Exception e) {
                                str = "Error: " + e.toString();

                        }
               
                }
               
                public boolean auter(){
                   if(ret.equals("true")) return true;
                        return false;
                       
                }
}

e questo è il server:
Codice (Java): [Seleziona]
public class serverprova {

        /**
         * @param args
         */

        public static void main(String[] args) {
                // TODO Auto-generated method stub
                ServerSocket serverSock = null;
                Socket cs = null;
               
                System.out.print("Creazione ServerSocket...");

                try {
                  serverSock = new ServerSocket(51000);
                }
                catch (IOException e) {
                  System.err.println(e.getMessage());
                  System.exit(1);
                }

                while (true) {      

                    try {
                        cs = serverSock.accept();
                        BufferedReader in = new BufferedReader(new InputStreamReader(cs.getInputStream()));
                                String txt = in.readLine();
                       
                               

                        String ret="false";    
                   
                        PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(cs.getOutputStream())),true);
                    out.println(ret);
                      cs.close();
                    }
                    catch (Exception e) {
                      System.out.println("Errore: " +e);
                      System.exit(3);
                    }

                }
        }

}

grazie per l'aiuto
« Ultima modifica: 05 Giugno 2013, 21:59:34 CEST da leo87 »

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
Re:Problema Socket
« Risposta #1 il: 06 Giugno 2013, 08:40:58 CEST »
0
Stai facendo un errore di concetto.
Codice (Java): [Seleziona]
  Connect client = new Connect(user,pass);
  Thread cThread = new Thread(client);
  cThread.start();
  boolean ret=client.auter();

Questo codice ti tornerà sempre e solo il valore di di default "true" che tu stesso hai impostato nella classe "Connect":
Codice (Java): [Seleziona]
  private String ret="true";

  //...

  public boolean auter(){
    if(ret.equals("true")) return true;    
    return false;
  }

Questo perché vai a chiamare auter() subito dopo aver lanciato il thread di connessione come se il thread fosse sincrono, ma è un thread e non può essere sincrono. In pratica stai chiedendo se è autorizzato *mentre* il thread sta ancora negoziando col server in parallelo.
Quest'approccio è sbagliato in un contesto asincrono, dovresti prevedere che la classe chiamante "ascolti" quando il thread termina la negoziazione, e solo allora andare a vedere il valore tornato.
Che poi è esattamente l'approccio degli AsyncTask (che onestamente non ho capito perché non usi in questo contesto, sono fatti apposta): dai un'occhiata al > tutorial <

Offline leo87

  • Nuovo arrivato
  • *
  • Post: 33
  • Respect: +1
    • Mostra profilo
  • Sistema operativo:
    windows 8
Re:Problema Socket
« Risposta #2 il: 06 Giugno 2013, 13:48:10 CEST »
0
Grazie mille  :D

Faccio subito la modifica, non usavo l'async perchè non sapevo che esistessero, ora guardo il tutor che mi hai postato. Non mi era passata l'idea del tempo di attesa nella comunicazione, grazie ;)

Non ho capito alcune cose, io faccio partire l'async e dentro il metodo doInBackground faccio la connessione  e lo scambio di messaggi con il server, questo metodo mi ritorna la stringa (false) che viene inviata al metodo onPostExecute (il quale inizializza la variabile globale con il valore che gli passa il metodo  doInBackground) mentre nell'activity che istanzia l'async dopo aver creato l'istanza async e avviata con il comando execute come faccio a prendermi la stringa ricevuta dal server?
grazie

« Ultima modifica: 08 Giugno 2013, 18:21:43 CEST da leo87 »

Offline leo87

  • Nuovo arrivato
  • *
  • Post: 33
  • Respect: +1
    • Mostra profilo
  • Sistema operativo:
    windows 8
Re:Problema Socket
« Risposta #3 il: 08 Giugno 2013, 18:21:26 CEST »
0

problema risolto...scusate  :-X
« Ultima modifica: 08 Giugno 2013, 19:14:33 CEST da leo87 »