Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    577

    [java/android] problema cone le socket

    ciao, sto usando il seguente codice da me modificato per catturare dati provenienti da localhost ma non viene visualizzato nulla.

    Quello che deve fare è, una volta mandata in esecuzione l'applicazione, connettersi attraverso un thread all'indirizzo 127.0.0.1 porta 5000 e nel momento in cui viene premuto il pulsante, evento onclick prelevare una dato su quella porta e visualizzarlo.

    codice:
    package com.javacodegeeks.android.androidsocketclient;
    import java.io.*;
    import java.net.*;
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.EditText;
    public class Client extends Activity {
     private Socket socket;
     //private static final int SERVERPORT = 5000;
     //private static final String SERVER_IP = "localhost";
     @Override
     public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);  
      
      new Thread(new ClientThread()).start();
     }
     
     public void onClick(View view) {
      try {
       EditText et = (EditText) findViewById(R.id.EditText01);
       BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
       et.setText(in.read());
       
      } catch (UnknownHostException e) {
       e.printStackTrace();
      } catch (IOException e) {
       e.printStackTrace();
      } catch (Exception e) {
       e.printStackTrace();
      }
     }
     class ClientThread implements Runnable {
      @Override
      public void run() {
       
       try {
        //InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
        socket = new Socket("localhost", 5000);
       } catch (UnknownHostException e1) {
        e1.printStackTrace();
       } catch (IOException e1) {
        e1.printStackTrace();
       }
      }
     }
    }
    Ultima modifica di misterx; 01-02-2014 a 10:11

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    577
    ragazzi, e se fosse l'emulatore bacato?
    Non avete avuto esperienze simili alla mia?
    Credo di aver settato anche le policy per l'uso delle socket in modo corretto

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Domanda banale... dici di avere un pulsante... e dove lo usi? Dov'è che gli setti l'OnClickListener()?

    Tra parentesi, quel metodo "onClick()" che hai dichiarato dentro alla Activity, non è sufficiente. Lo puoi anche chiamare "onPippo()", è un tuo metodo custom che non viene usato da nessuno e siccome la tua Activity non implementa OnClickListener, non puoi nemmeno usarla come tale per il tuo pulsante.

    Nel onCreate() dovresti avere qualcosa del genere:

    codice:
    final Button cmd = (Button) findViewById(R.id.id_del_tuo_pulsante);
    cmd.setOnClickListener( new OnClickListener() {
       @Override
       public void onClick(View v) {
          ...   // Fai qualcosa quando viene premuto
       }
    });

    PS: nel manifest devi dichiamare la permission

    codice:
    <uses-permission android:name="android.permission.INTERNET" />

    Inoltre, sarebbe meglio utilizzare un diverso costruttore per la Socket ed il metodo di connessione che prende il timout in millisecondi, altrimenti se il tuo server è down o non raggiungibile, la tua app rimane appesa.


    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
    Mar 2001
    Messaggi
    577
    ciao,
    è un esempio trovato in rete. Per quanto riguarda l'evento onClick() e me sembra che funzioni infatti se all'interno di tale metotdo scrivo: et.setText("hai cliccato sul pulsante");
    tale messaggio viene mostrato solo dopo la pressione del pulsante che trovo sull'interfaccia.
    Credo che l'evento sia stato associato in un qualche file xml; scusa ma sono ancora agli inizi per quanto concerbe android quindi non riesco ad essere più preciso.


    Comunque partendo da quella base l'ho modificato ed ora inizio a vedere qualche dato ma ho un problema:

    codice:
    
    
    Socket s =null;
    BufferedReader in; int st;
    EditText et = (EditText) findViewById(R.id.editText1); try
    { s = new Socket("127.0.0.1", 5000); in = new BufferedReader(new InputStreamReader(s.getInputStream())); while ((st=in.read()) != -1) { et.setText(Integer.toString(st)); } } catch (UnknownHostException e) { et.setText("socket: unknown host"); } catch (IOException e) { et.setText("socket: IO Exception"); } catch (Exception e) { et.setText("socket: Exception e");
    }
    spero sia sufficiente questo scorcio di codice per mostrare che viene sollevata sempre l'ultima eccezione ma nn me ne spiego il motivo.

  5. #5
    Ciao misterix, quel codice non funziona in quanto l'indirizzo ip che hai messo è localhost si ma di chi.... io direi del dispositivo in cui gira quel codice quindi il telefono o l'emulatore se lo stai facendo girare sul l'emulatore.
    Per connetterti alla macchina host (ovviamente sto parlando di esecuzione su emulatore) devi specificare l'ip 10.0.2.2 come specificato in http://developer.android.com/tools/d...tworkaddresses


  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    577
    grazie 1000, corretto.

    Però mi rimane il problema della lettura in loop, dopo il primo carattere letto viene generata una eccezione: va refreshato qualcosa?
    Ho provato con un banale

    et.setText(" ");
    e poi
    et.setText(Integer.toString(st));

    ma non cambia nulla


  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Quote Originariamente inviata da misterx Visualizza il messaggio
    dopo il primo carattere letto viene generata una eccezione
    Ok, molto probabilmente il metodo è associato direttamente nel XML del Layout dell'Activity (non che la cosa mi piaccia molto, ma si può fare).

    Se viene generata un'eccezione, dovresti postarla qui... altrimenti non ti possiamo dire cosa c'è che va in errore e come correggerla.

    Posta tutto lo stackTrace che ti viene indicato nel LogCat, ma prima di questo, non ammazzare l'eccezione:

    codice:
    try {
       ...   // istruzioni che possono sollevare eccezioni
    } catch (Exception e) {
       Log.e("TuoTag", "Descrizione del punto di errore", e);
    }

    Così nel LogCat viene stampato tutto lo stackTrace dell'eccezione... nel modo in cui stai facendo tu, l'eccezione la stai buttando via, perdendo qualunque tipo di informazione (ovvero, tutto ciò che di utile c'è per te per capire il problema).


    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

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    577
    quel Looper.prepare()



    02-04 14:55:59.323: E/TuoTag(2088): Descrizione del punto di errore
    02-04 14:55:59.323: E/TuoTag(2088): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
    02-04 14:55:59.323: E/TuoTag(2088): at android.os.Handler.<init>(Handler.java:200)
    02-04 14:55:59.323: E/TuoTag(2088): at android.os.Handler.<init>(Handler.java:114)
    02-04 14:55:59.323: E/TuoTag(2088): at android.view.textservice.SpellCheckerSession$1.<in it>(SpellCheckerSession.java:108)
    02-04 14:55:59.323: E/TuoTag(2088): at android.view.textservice.SpellCheckerSession.<init >(SpellCheckerSession.java:108)
    02-04 14:55:59.323: E/TuoTag(2088): at android.view.textservice.TextServicesManager.newSp ellCheckerSession(TextServicesManager.java:160)
    02-04 14:55:59.323: E/TuoTag(2088): at android.widget.SpellChecker.resetSession(SpellChec ker.java:127)
    02-04 14:55:59.323: E/TuoTag(2088): at android.widget.SpellChecker.setLocale(SpellChecker .java:148)
    02-04 14:55:59.323: E/TuoTag(2088): at android.widget.SpellChecker.spellCheck(SpellChecke r.java:231)
    02-04 14:55:59.323: E/TuoTag(2088): at android.widget.Editor.updateSpellCheckSpans(Editor .java:510)
    02-04 14:55:59.323: E/TuoTag(2088): at android.widget.Editor.sendOnTextChanged(Editor.jav a:986)
    02-04 14:55:59.323: E/TuoTag(2088): at android.widget.TextView.sendOnTextChanged(TextView .java:7423)
    02-04 14:55:59.323: E/TuoTag(2088): at android.widget.TextView.setText(TextView.java:3827 )
    02-04 14:55:59.323: E/TuoTag(2088): at android.widget.TextView.setText(TextView.java:3682 )
    02-04 14:55:59.323: E/TuoTag(2088): at android.widget.EditText.setText(EditText.java:80)
    02-04 14:55:59.323: E/TuoTag(2088): at android.widget.TextView.setText(TextView.java:3657 )
    02-04 14:55:59.323: E/TuoTag(2088): at com.example.interceptor.MainActivity$ClientThread. run(MainActivity.java:46)
    02-04 14:55:59.323: E/TuoTag(2088): at java.lang.Thread.run(Thread.java:841)
    02-04 14:56:00.063: D/gralloc_goldfish(2088): Emulator without GPU emulation detected.
    Ultima modifica di misterx; 04-02-2014 a 22:04

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    577
    scusate ma è meglio guardare questo



    02-05 01:55:08.353: E/TuoTag(1279): Descrizione del punto di errore
    02-05 01:55:08.353: E/TuoTag(1279): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
    02-05 01:55:08.353: E/TuoTag(1279): at android.os.Handler.<init>(Handler.java:200)
    02-05 01:55:08.353: E/TuoTag(1279): at android.os.Handler.<init>(Handler.java:114)
    02-05 01:55:08.353: E/TuoTag(1279): at android.view.textservice.SpellCheckerSession$1.<in it>(SpellCheckerSession.java:108)
    02-05 01:55:08.353: E/TuoTag(1279): at android.view.textservice.SpellCheckerSession.<init >(SpellCheckerSession.java:108)
    02-05 01:55:08.353: E/TuoTag(1279): at android.view.textservice.TextServicesManager.newSp ellCheckerSession(TextServicesManager.java:160)
    02-05 01:55:08.353: E/TuoTag(1279): at android.widget.SpellChecker.resetSession(SpellChec ker.java:127)
    02-05 01:55:08.353: E/TuoTag(1279): at android.widget.SpellChecker.setLocale(SpellChecker .java:148)
    02-05 01:55:08.353: E/TuoTag(1279): at android.widget.SpellChecker.spellCheck(SpellChecke r.java:231)
    02-05 01:55:08.353: E/TuoTag(1279): at android.widget.Editor.updateSpellCheckSpans(Editor .java:510)
    02-05 01:55:08.353: E/TuoTag(1279): at android.widget.Editor.sendOnTextChanged(Editor.jav a:986)
    02-05 01:55:08.353: E/TuoTag(1279): at android.widget.TextView.sendOnTextChanged(TextView .java:7423)
    02-05 01:55:08.353: E/TuoTag(1279): at android.widget.TextView.setText(TextView.java:3827 )
    02-05 01:55:08.353: E/TuoTag(1279): at android.widget.TextView.setText(TextView.java:3682 )
    02-05 01:55:08.353: E/TuoTag(1279): at android.widget.EditText.setText(EditText.java:80)
    02-05 01:55:08.353: E/TuoTag(1279): at android.widget.TextView.setText(TextView.java:3657 )
    02-05 01:55:08.353: E/TuoTag(1279): at com.example.interceptor.MainActivity$ClientThread. run(MainActivity.java:49)
    02-05 01:55:08.353: E/TuoTag(1279): at java.lang.Thread.run(Thread.java:841)

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Questa eccezione viene sollevata quando si cerca di invocare del codice che dovrebbe essere eseguito nel UI Thread, da un thread diverso. In particolare alla riga 49 del tuo file "MainActivity.java" stai facendo qualcosa che richiede di essere eseguito nel UI Thread (ad esempio, una banalissima Toast.makeText() o molto probabilmente quell'istruzione "et.setText(Integer.toString(st));"), ma tu non sei nell'UI Thread, sei in un tuo thread (ClientThread, per la precisione).

    Non puoi accedere all'interfaccia utente (UI) da un thread esterno... l'interfaccia utente è governata dal UI Thread.

    Se vuoi modificare l'interfaccia devi far passare l'azione dentro al UI Thread. Questo è un modo:

    codice:
    tuaActivity.runOnUiThread(new Runnable() {
      public void run() {
        et.setText( Integer.toString(st) );
      }
    });

    Dove "tuaActivity" è un riferimento alla tua Activity. Ovviamente l'oggetto "et" deve essere dichiarato "final".

    Io, sinceramente, preferisco far richiamare un metodo della Activity stessa che si occupa di fare gli aggiornamenti.


    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

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.