Autore Topic: Problemi comunicazione client server tramite socket  (Letto 1807 volte)

Offline christian13

  • Utente junior
  • **
  • Post: 84
  • Respect: +2
    • Mostra profilo
Problemi comunicazione client server tramite socket
« il: 13 Luglio 2014, 16:05:48 CEST »
0
Salve a tutti, come da titolo ho un problema nell'utilizzo di un socket.
Quello che vorrei fare è molto semplice;
realizzare un'app android che comunica attraverso un server realizzato nel notebook tramite eclipse che ha il seguente codice:

public class Server {
   public static void main(String[]args){
      ServerSocket serverSock = null;
      Socket cs = null;
      System.err.println("Socket Server");
      try {
      serverSock = new ServerSocket(9000);
      
      }
      catch (IOException e) {
      System.err.println(e.getMessage());
      System.exit(1);
      }
      while (true) {
      System.out.println("Attesa connessione…");
      try {
      cs = serverSock.accept();
      }
      catch (IOException e) {
      System.out.println("Connessione fallita");
      System.exit(2);
      }
      System.out.println("Connessione da " + cs);
      try {
      BufferedInputStream ib = new
      BufferedInputStream(cs.getInputStream());
      DataInputStream is = new DataInputStream(ib);
      BufferedOutputStream ob = new
      BufferedOutputStream(cs.getOutputStream());
      PrintStream os = new PrintStream(ob,false);
      String line;
      line = new String(is.readLine());
      //La stringa inizia dopo il secondo carattere
      String comando_android_stringa=line.substring(2);
      System.out.println("Il client ha inviato questa stringa:"+comando_android_stringa);
      os.close(); is.close(); cs.close();
      }
      catch (Exception e) {
      System.out.println("Errore: " +e);
      System.exit(3);
      }
      }
      }
}
-----------------------------------------------------------------------

Ho provato a fare l'app solo che mi ha dato molti problemi, inizialmente mi lanciava un'IOException e il messaggio era: socket failed EACCESS(permission denied).

Il manifestFile.xml con i permessi è il seguente:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myfirstapp"
    android:versionCode="1"
    android:versionName="1.0" >
<uses-permission android:name=”android.permission.INTERNET”/>
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.myfirstapp.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

-------------------------------------------
la mia MainActivity.java è la seguente:
public class MainActivity extends ActionBarActivity {

    public void clickButtonSocket(View view){
       Context context1 = getApplicationContext();
         CharSequence text1 = "inizio socket";
         int duration1 = Toast.LENGTH_SHORT;

         Toast toast1 = Toast.makeText(context1, text1, duration1);
         toast1.show();
      
      
       Socket socket = null;
       DataOutputStream dataOutputStream = null;
       DataInputStream dataInputStream = null;


      
       try{
          socket = new Socket("192.168.1.5",9000);
          dataOutputStream = new DataOutputStream(socket.getOutputStream());
          dataInputStream = new DataInputStream(socket.getInputStream());
          dataOutputStream.writeUTF("Questa e una prova");
          }
       catch (UnknownHostException e) {
          Context context = getApplicationContext();
            CharSequence text = e.getMessage();
            int duration = Toast.LENGTH_SHORT;

            Toast toast = Toast.makeText(context, text, duration);
            toast.show();
         } catch (IOException e) {
            Context context = getApplicationContext();
            CharSequence text = e.getMessage();
            int duration = Toast.LENGTH_SHORT;

            Toast toast = Toast.makeText(context, text, duration);
            toast.show();
         }
       finally{
            if (socket != null){
            try {
            socket.close();
            } catch (IOException e) {
               Context context = getApplicationContext();
               CharSequence text = e.getMessage();
               int duration = Toast.LENGTH_SHORT;

               Toast toast = Toast.makeText(context, text, duration);
               toast.show();
            }
            }
            if (dataOutputStream != null){
               try {
               dataOutputStream.close();
               } catch (IOException e) {
                  Context context = getApplicationContext();
                  CharSequence text = e.getMessage();
                  int duration = Toast.LENGTH_SHORT;

                  Toast toast = Toast.makeText(context, text, duration);
                  toast.show();
               }
               }
               if (dataInputStream != null){
               try {
               dataInputStream.close();
               } catch (IOException e) {
                  Context context = getApplicationContext();
                  CharSequence text = e.getMessage();
                  int duration = Toast.LENGTH_SHORT;

                  Toast toast = Toast.makeText(context, text, duration);
                  toast.show();
               }
               }
               }
               }
            
      
   
   
   
   public void clickButton1(View view){
      Context context = getApplicationContext();
      CharSequence text = "Hello toast!";
      int duration = Toast.LENGTH_SHORT;

      Toast toast = Toast.makeText(context, text, duration);
      toast.show();
      
   }
   
   
   
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.container, new PlaceholderFragment())
                    .commit();
        }
       
       
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
       
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    /**
     * A placeholder fragment containing a simple view.
     */
    public static class PlaceholderFragment extends Fragment {

        public PlaceholderFragment() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_main, container, false);
            return rootView;
        }
    }

}
-----------------------------------------------------------------
il metodo che avvia la comunicazione è "clickButtonSocket" che viene richiamato con il click di un bottone.
Ho messo molti toast message all'interno, solo per vedere dove avviene l'errore.

Comunque quando clicco il tasto mi stampa il primo toast "inizio socket", dopo due secondi mi stampa il toast "socket failed:EACCESS(permission denied)" che è l'eccezione "IOExcpetion".



Qualcuno potrebbe aiutarmi?

Vi ringrazio molto per la disponibilità.
« Ultima modifica: 13 Luglio 2014, 18:15:33 CEST da christian13 »

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Problemi comunicazione client server tramite socket
« Risposta #1 il: 13 Luglio 2014, 18:33:59 CEST »
0
Non puoi usare la rete nello stesso thread della UI a partire da ICS (Android 4.0.x).

Quando tu clicchi il bottone sei nel thread dell'interfaccia e vai a richiamare i socket. A prescindere dal fatto che ci sia un errore nel codice (che potrebbe essere anche perfettamente funzionante in teoria), così come l'hai scritto su ICS non deve funzionare.

Visto che ci sono per i log non ti consiglio di usare i toast, sono lenti e non credo siano così affidabili.
Dovresti usare la funzione Log.e(stringatag,stringaerrore);

 :-)

Offline christian13

  • Utente junior
  • **
  • Post: 84
  • Respect: +2
    • Mostra profilo
Re:Problemi comunicazione client server tramite socket
« Risposta #2 il: 14 Luglio 2014, 09:24:32 CEST »
0
Innanzi tutto ti ringrazio moltissimo per la disponibilità e la gentilezza.

Vorrei chiederti come posso modificare il codice così da avviare un nuovo thread che usa la rete e quindi apre il socket corrispondente?

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Problemi comunicazione client server tramite socket
« Risposta #3 il: 14 Luglio 2014, 11:46:48 CEST »
0
Il principio non è complicato.

Ci sono tendenzialmente due tipi di operazioni "parallele": gli asynctask e i thread. L'asynctask serve per eseguire una operazione X in un momento nel futuro. Il thread è più appropriato quando vuoi avere qualcosa di complesso che gira effettivamente "accanto" alla tua app. Spiegata così è molto terra terra ma in questo caso mi sembra logico usare i thread.

Hai due scelte: o fai una classe che implementa runnable o oppure una che estende thread. Io preferisco estendere thread ma c'è chi preferisce implementare runnable.
In generale ti consiglio, visto che al momento il progetto è semplice, di farti una classe interna che estende Thread. All'interno di questa classe ridefinisci il metodo run() (anche la runnable ha run() ). Questo metodo è il tuo thread, nel senso che quando il thread viene avviato avvia run e quando run termina il thread è terminato.

Per farla semplice quando avvii il thread nella run puoi fare un ciclo while che attende che si verifichi un evento. Se l'evento è esci dalla app, esci dal while. Se l'evento è usare la rete, usi la rete.

Codice (Java): [Seleziona]
 while (!m_bMustTerminate) {
if( m_bMustUseNetwork ){
// qui ci metti il codice di rete
// qui lo metti false così al prossimo ciclo non lo esegue
m_bMustUseNetwork = false;
}
}
Ti basta mettere m_bMustUseNetwork = true; nel tuo onclick per far partire il codice di rete in parallelo.
Ovviamente metti m_bMustTerminate = true; sulla onDestroy().

Tieni presente che questa soluzione fa schifo. Una gestione corretta dei thread utilizza gli handler e permette di inviare e ricevere messaggi. Considerando che il codice che hai postato è molto semplice si può assumere in questo contesto che sia sicuro leggere un booleano per eseguire il codice.

 :-)

Offline christian13

  • Utente junior
  • **
  • Post: 84
  • Respect: +2
    • Mostra profilo
Re:Problemi comunicazione client server tramite socket
« Risposta #4 il: 14 Luglio 2014, 19:22:33 CEST »
0
Se non ho capito male, nella stessa applicazione Android mi creo una classe che estende Thread e li dentro ridefinisco il metodo run()-->(dove inserirò il codice per lavorare con la socket).

Nella Acivity principale all'interno dell'evento onClick del bottone istanzio quella classe e richiamo il metodo run?  :-[ :-[

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Problemi comunicazione client server tramite socket
« Risposta #5 il: 15 Luglio 2014, 08:41:53 CEST »
0
Se non ho capito male, nella stessa applicazione Android mi creo una classe che estende Thread e li dentro ridefinisco il metodo run()-->(dove inserirò il codice per lavorare con la socket).
Si il codice lo metti all'interno del while e dell'if così da eseguirlo una volta sola.
Citazione
Nella Acivity principale all'interno dell'evento onClick del bottone istanzio quella classe e richiamo il metodo run?  :-[ :-[
Allora... qui è più complicato. Intanto non devi chiamare mai il metodo run ma devi chiamare il metodo start.
In teoria per sincronizzare il thread al ciclo dell'activity dovresti utilizzare un semaforo per fermare/avviare il thread.
La soluzione semplice è istanziare la classe nella onresume e sempre nella onresume fai partire il thread (non chiamando il metodo run ma usando appunto la funzione start()). Nella onpause chiami interrupt e fermi il thread.
In pratica invece di avviarlo e stopparlo se fai così lo crei e lo distruggi.

Nella onclick metti solo m_bMustUseNetwork = true; e il codice viene eseguito automaticamente (una volta sola).

 ;-)

Offline christian13

  • Utente junior
  • **
  • Post: 84
  • Respect: +2
    • Mostra profilo
Re:Problemi comunicazione client server tramite socket
« Risposta #6 il: 23 Luglio 2014, 09:38:37 CEST »
0
Le chiedo scusa. Non sono riuscito a risolvere e ho un po di confusione.
Per caso ha qualche semplice esempio?


Ringrazio moltissimo per la disponibilità concessa.

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Problemi comunicazione client server tramite socket
« Risposta #7 il: 23 Luglio 2014, 15:11:28 CEST »
0
Diamoci pure del tu!  :-)

Ti scrivo del codice molto semplice giusto per darti un'idea.

Codice (Java): [Seleziona]
public class MainActivity extends Activity {

        // il nostro thread
        protected myThread m_Thread = null;
       
        // La clase del nostro thread
        class myThread extends Thread{
               
                // Questo diventa true quando vogliamo eseguire codice
                protected boolean m_bMustExecute = false;
               
                public void startExecution(){
                        m_bMustExecute = true;
                }
               
                // Ridefiniamo il metodo run.
                @Override
                public void run(){
                       
                        while(true){
                                if( m_bMustExecute ){

                                        // qui ci va il codice da eseguire
                                       
                                       
                                        // rimettiamo false così non esegue due volte
                                        m_bMustExecute = false;
                                }
                        }
                       
                }
        };
       
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        // creiamo il thread
        m_Thread = new myThread();
        // lo facciamo partire, tanto non fa nulla attende che chiamiamo startExecution()
        m_Thread.start();
       
    }

}

Ti basta mette il codice da eseguire nella run, poi chiamare m_Thread.startExecution() nella onlick del bottone e hai risolto.
Una volta che ti funziona dovresti gestire correttamente pausa e resume.  ;-)

Offline christian13

  • Utente junior
  • **
  • Post: 84
  • Respect: +2
    • Mostra profilo
Re:Problemi comunicazione client server tramite socket
« Risposta #8 il: 24 Luglio 2014, 16:28:17 CEST »
0
Innanzi tutto grazie mille per la grandissima disponibilità, per la pazienza e soprattutto per le risposte veramente tempestive.... :D

Ho seguito i tuoi consigli ed ora sembra funzionare. Il server è una semplice applicazione java che lancio su eclipse. In ogni caso scrivo il codice di tutto così magari potrebbe essere utile anche a qualcun'altro.


Il codice della classe MainActivity dell'app è il seguente:

public class MainActivity extends ActionBarActivity {

   
   public void clickButton1(View view){
      m_Thread.startExecution();
      }
   
   protected myThread m_Thread = null;
   
   // La clase del nostro thread
    class myThread extends Thread{
           
            // Questo diventa true quando vogliamo eseguire codice
            protected boolean m_bMustExecute = false;
           
            public void startExecution(){
                    m_bMustExecute = true;
            }
           
            // Ridefiniamo il metodo run.
            @Override
            public void run(){
                   
                    while(true){
                            if( m_bMustExecute ){

                               Socket socket = null;
                               DataOutputStream dataOutputStream = null;
                               DataInputStream dataInputStream = null;
                               try {socket = new Socket("192.168.1.5", 10324);
                               dataOutputStream = new DataOutputStream(socket.getOutputStream());
                               dataInputStream = new DataInputStream(socket.getInputStream());
                               dataOutputStream.writeUTF("Questa e’ una prova");
                               } catch (UnknownHostException e) {
                               } catch (IOException e) {
                               }
                               finally{
                               if (socket != null){
                               try {
                               socket.close();
                               } catch (IOException e) {
                               }
                               }
                               if (dataOutputStream != null){
                               try {
                               dataOutputStream.close();
                               } catch (IOException e) {
                               }
                               }
                               if (dataInputStream != null){
                               try {
                               dataInputStream.close();
                               } catch (IOException e) {
                               }
                               }
                               }
                               }
                                                                       
                                    // rimettiamo false così non esegue due volte
                                    m_bMustExecute = false;
                            }
                    }
                   
            };
      
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.container, new PlaceholderFragment())
                    .commit();
        }
       
       
     // creiamo il thread
        m_Thread = new myThread();
        // lo facciamo partire, tanto non fa nulla attende che chiamiamo startExecution()
        m_Thread.start();
       
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
       
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    /**
     * A placeholder fragment containing a simple view.
     */
    public static class PlaceholderFragment extends Fragment {

        public PlaceholderFragment() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_main, container, false);
            return rootView;
        }
    }

}
------------------------------------------------------------------------------------------------
// Questo è l'AndroidManifest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myfirstapp"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.myfirstapp.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
----------------------------------------------------------------------------
//ed infine questo è il codice del server che gira su eclipse:

public class Server{
public static void main(String[]args){
ServerSocket serverSock = null;
Socket cs = null;
System.err.println("Socket Server");
try {
serverSock = new ServerSocket(10324);
}
catch (IOException e) {
System.err.println(e.getMessage());
System.exit(1);
}
while (true) {
System.out.println("Attesa connessione…");
try {
cs = serverSock.accept();
}
catch (IOException e) {
System.out.println("Connessione fallita");
System.exit(2);
}
System.out.println("Connessione da " + cs);
try {
BufferedInputStream ib = new
BufferedInputStream(cs.getInputStream());
DataInputStream is = new DataInputStream(ib);
BufferedOutputStream ob = new
BufferedOutputStream(cs.getOutputStream());
PrintStream os = new PrintStream(ob,false);
String line;
line = new String(is.readLine());
//La stringa inizia dopo il secondo carattere
String comando_android_stringa=line.substring(2);
System.out.println("Il client ha inviato questa stringa:"+comando_android_stringa);
os.close(); is.close(); cs.close();
}
catch (Exception e) {
System.out.println("Errore: " +e);
System.exit(3);
}
}
}
}
-----------------------------------------------------------------


IMPORTANTE: il codice aggiunto a quello che mi hai postato tu e il codice del server, li ho presi da internet, dal seguente link:

Net Life Blog: Sistema Client-Server tra Android e pc: Creazione delle Socket




Post unito: [time]24 Luglio 2014, 17:59:57 CEST[/time]
---------------------------------------------------------------------------------------------------------------------------------

Sembra funzionare sia dall'emulatore android su eclipse e sia se lancio l'app su un tablet connesso sulla stessa rete wifi del pc(su cui gira il server).   ;-) ;-)

L'UNICO PROBLEMA è che per inviare la stringa al server (sia dal tablet che dall'emulatore) devo premere continuamente più volte il bottone.
Con un solo click il server non riceve nulla.

A cosa è dovuto? :-\ :-\
« Ultima modifica: 24 Luglio 2014, 18:05:42 CEST da christian13 »

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Problemi comunicazione client server tramite socket
« Risposta #9 il: 24 Luglio 2014, 21:57:44 CEST »
0
Prova a mettere dentro l'if nella run un log

Log.e("thread","eseguito");

Vedi da logcat se ogni volta che premi il bottone viene eseguito.
Se si allora il problema è nel codice all'interno dell'if. :-)

Offline christian13

  • Utente junior
  • **
  • Post: 84
  • Respect: +2
    • Mostra profilo
Re:Problemi comunicazione client server tramite socket
« Risposta #10 il: 25 Luglio 2014, 16:41:56 CEST »
0
Ho inserito il log dove mi hai detto.
Quando clicco il bottone, se il server riceve la richiesta(e quindi stampa la stringa ricevuta) allora viene anche eseguito il log(il logCat mi stampa il log), se il server non riceve la richiesta il log non viene eseguito. Quindi sembrerebbe esserci qualche problema nel click del bottone?
 :-\ :-\ :-\

Alcune volte la richiesta va a buon fine appena clicco, alcune volte invece devo cliccare più volte consecutive per far arrivare la richiesta al server e quindi fare anche stampare il log inserito.


Post unito: [time]25 Luglio 2014, 19:09:10 CEST[/time]
In ogni caso ho provato a inserire più log all'interno del codice facendo stampare ad ogni log un numero differente....

............
if( m_bMustExecute ){
                               
                             
                               
                               Log.e("controllo thread","1");

                               Socket socket = null;
                               DataOutputStream dataOutputStream = null;
                               DataInputStream dataInputStream = null;
                               try {socket = new Socket("192.168.1.5", 10324);
                               
                               dataOutputStream = new DataOutputStream(socket.getOutputStream());
                               dataInputStream = new DataInputStream(socket.getInputStream());
                               dataOutputStream.writeUTF("Questa e’ una prova");
                               } catch (UnknownHostException e) {
                                  Log.e("controllo thread","2");
                               } catch (IOException e) {
                                  Log.e("controllo thread","3");
                               }
                               finally{
                               if (socket != null){
                               try {
                                  Log.e("controllo thread","4");
                               socket.close();
                               } catch (IOException e) {
                                  Log.e("controllo thread","5");
                               }
                               }
                               if (dataOutputStream != null){
                               try {
                                  Log.e("controllo thread","6");
                                  
                               dataOutputStream.close();
                               } catch (IOException e) {
                                  Log.e("controllo thread","7");
                               }
                               }
                               if (dataInputStream != null){
                               try {
                                  Log.e("controllo thread","8");
                               dataInputStream.close();
                               } catch (IOException e) {
                                  Log.e("controllo thread","9");
                               }
                               }
                               }
                               }
.............

Quando clicco più volte consecutive il bottone (e quindi viene inviata la richiesta al server) il LogCat mi stampa la seguente serie di log: 1 4 6 8
Se clicco una sola volta (avvolte anche due-tre...) non viene inviato il messaggio al server e il LogCat non stampa nulla, mentre se premo il bottone più volte in continuazione allora viene inviato il messaggio al server (che lo riceve e lo stampa) e il TomCat mi stampa i rispettivi log: 1,4,6,8

  :-\ :-\ :-\ :-\
« Ultima modifica: 25 Luglio 2014, 19:10:26 CEST da christian13 »

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Problemi comunicazione client server tramite socket
« Risposta #11 il: 27 Luglio 2014, 10:09:02 CEST »
0
Il comportamento è strano.
Prova a commentare tutto quello che è il codice di rete nell'if e lascia il log.e e l'ultimo comando (quello che rimette la variabile false).
Poi aggiungi un log.e nella onclick del bottone, per vedere se effettivamente c'è corrispondenza tra il click del bottone, la chiamata della onclick e l'esecuzione del codice dentro l'if del thread.

 :-)

Offline christian13

  • Utente junior
  • **
  • Post: 84
  • Respect: +2
    • Mostra profilo
Re:Problemi comunicazione client server tramite socket
« Risposta #12 il: 27 Luglio 2014, 15:35:44 CEST »
0
Si effettivamente è molto strano. Questi sono i log che ho inserito:

public void clickButton1(View view){
      Log.e("prova", "onClick bottone");
      m_Thread.startExecution();
      }
   
   protected myThread m_Thread = null;
   
   // La classe del nuovo thread
    class myThread extends Thread{
           
            // Questo diventa true quando vogliamo eseguire codice
            protected boolean m_bMustExecute = false;
           
            public void startExecution(){
                   Log.e("prova", "booleano a true");
                    m_bMustExecute = true;
                    Log.e("prova", "il valore è" + m_bMustExecute);
            }
           
            // Ridefiniamo il metodo run.
            @Override
            public void run(){
                       while(true){
                            if( m_bMustExecute ){
                               
                             
                               
                               Log.e("prova","dentro if");
                               
                               /*
                 codice socket......
     
                               */

                               }
                                   
                                   
                                    // rimettiamo false così non esegue due volte
                                    m_bMustExecute = false;
                            }
                    }
                   
            };
--------------------------------------------------

in pratica i tre log "onClickBottone", "booleano a true" "il valore è " (quest'ultimo mi dice sempre che m_bMustExecute è true), vengono sempre stampati ad ogni click del bottone, mentre il log "dentro if" viene stampato solo alcune volte casualmente.
 :-\ :-\ :-\

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Problemi comunicazione client server tramite socket
« Risposta #13 il: 27 Luglio 2014, 16:02:02 CEST »
0
Dovresti formattare il codice con gli appositi tastini (quello a forma di tazzina java e quello con scritto XML), per dare una migliore leggibilità.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline christian13

  • Utente junior
  • **
  • Post: 84
  • Respect: +2
    • Mostra profilo
Re:Problemi comunicazione client server tramite socket
« Risposta #14 il: 27 Luglio 2014, 16:25:17 CEST »
0
Si in effetti hai pienamente ragione, chiedo scusa.

Codice (Java): [Seleziona]
public void clickButton1(View view) {
                Log.e("prova thread", "onClick bottone");
                m_Thread.startExecution();
        }

        protected myThread m_Thread = null;

        // La classe del nuovo thread
        class myThread extends Thread {

                // Questo diventa true quando vogliamo eseguire codice
                protected boolean m_bMustExecute = false;

                public void startExecution() {
                        Log.e("prova thread", "imposto booleano a true");
                        m_bMustExecute = true;
                        Log.e("prova thread", "il valore è" + m_bMustExecute);
                }

                // Ridefiniamo il metodo run.
                @Override
                public void run() {
                        Log.e("prova thread",
                                        "inizio metodo run, il valore del booleano è: "
                                                        + m_bMustExecute);
                        while (true) {

                                if (m_bMustExecute) {

                                        Log.e("prova thread", "dentro all'if del while");

                                        /*
                                         * Socket socket = null; DataOutputStream dataOutputStream =
                                         * null; DataInputStream dataInputStream = null; try {socket
                                         * = new Socket("192.168.1.5", 10324);
                                         *
                                         * dataOutputStream = new
                                         * DataOutputStream(socket.getOutputStream());
                                         * dataInputStream = new
                                         * DataInputStream(socket.getInputStream());
                                         * dataOutputStream.writeUTF("Questa e’ una prova"); } catch
                                         * (UnknownHostException e) { Log.e("controllo thread","2");
                                         * } catch (IOException e) { Log.e("controllo thread","3");
                                         * } finally{ if (socket != null){ try {
                                         * Log.e("controllo thread","4"); socket.close(); } catch
                                         * (IOException e) { Log.e("controllo thread","5"); } } if
                                         * (dataOutputStream != null){ try {
                                         * Log.e("controllo thread","6");
                                         *
                                         * dataOutputStream.close(); } catch (IOException e) {
                                         * Log.e("controllo thread","7"); } } if (dataInputStream !=
                                         * null){ try { Log.e("controllo thread","8");
                                         * dataInputStream.close(); } catch (IOException e) {
                                         * Log.e("controllo thread","9"); } } }
                                         */

                                }

                                // rimettiamo false così non esegue due volte
                                m_bMustExecute = false;

                        }
                }
        };

        // fine internet

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

                if (savedInstanceState == null) {
                        getSupportFragmentManager().beginTransaction()
                                        .add(R.id.container, new PlaceholderFragment()).commit();
                }

                // creiamo il thread
                m_Thread = new myThread();
                // lo facciamo partire, tanto non fa nulla attende che chiamiamo
                // startExecution()
                m_Thread.start();

        }

---------------------------------------------

Ho inserito vari log, il problema sostanzialmente è che quando clicco il bottone non entra sempre nella run, infatti i vari log che elenco li stampa sempre(ad ogni pressione del bottone):
-Log.e("prova thread", "onClick bottone");
-Log.e("prova thread", "imposto booleano a true");
-Log.e("prova thread", "il valore è" + m_bMustExecute);

mentre il log:
-Log.e("prova thread", "dentro all'if del while");
lo stampa solo qualche volta.

Da quanto verificato credo che il problema è proprio che non viene sempre eseguito il metodo run(), da cosa potrebbe dipendere? :-\ :-\ :-\