Autore Topic: Client TCP su Android  (Letto 2419 volte)

Offline Lomba1986

  • Utente normale
  • ***
  • Post: 173
  • Respect: +1
    • Mostra profilo
Client TCP su Android
« il: 21 Febbraio 2012, 14:48:49 CET »
0
Salve a tutti, ho un problemino con Android...

E' una sorta di programmino scolastico per vedere alcune cose intanto che imparo a programmare...

Vi spiego: ho scritto un semplice programmino in JAVA che accetta connessioni TCP su una porta e restituisce la stringa che il client aveva inviato... Scrivendo in JAVA il client il tutto funziona perfettamente

Solamente che quando ho cercato di portare tutto all'interno di Android ho simpaticamente scoperto che a volte funziona ma molto più spesso no...o meglio...il programma si collega al server, ma nel momento d'iniviare i dati s'impalla tutto quanto e sul LogCat mi compare solamente il seguente report

 GC_EXPLICIT freed 453K, 44% free 4325K/7687K, external 1316K/1828K, paused 76ms

magari scritto più volte (con numeri differenti) e poi:

02-21 13:43:59.599: I/InputDispatcher(60): Application is not responding: AppWindowToken{406cb798 token=HistoryRecord{40668d10 lomba.AndroidClient/.connessioneTCP}} - Window{406f4ca8 lomba.AndroidClient/lomba.AndroidClient.connessioneTCP paused=false}.  5044.9ms since event, 5044.2ms since wait started
02-21 13:43:59.599: I/WindowManager(60): Input event dispatching timed out sending to lomba.AndroidClient/lomba.AndroidClient.connessioneTCP
02-21 13:43:59.626: I/Process(60): Sending signal. PID: 330 SIG: 3
02-21 13:43:59.626: I/dalvikvm(330): threadid=4: reacting to signal 3
02-21 13:43:59.636: I/dalvikvm(330): Wrote stack traces to '/data/anr/traces.txt'
02-21 13:43:59.646: I/Process(60): Sending signal. PID: 60 SIG: 3
02-21 13:43:59.646: I/dalvikvm(60): threadid=4: reacting to signal 3
02-21 13:43:59.696: I/dalvikvm(60): Wrote stack traces to '/data/anr/traces.txt'
02-21 13:43:59.706: I/Process(60): Sending signal. PID: 126 SIG: 3
02-21 13:43:59.706: I/dalvikvm(126): threadid=4: reacting to signal 3
02-21 13:43:59.766: I/dalvikvm(126): Wrote stack traces to '/data/anr/traces.txt'
02-21 13:43:59.786: I/Process(60): Sending signal. PID: 128 SIG: 3
02-21 13:43:59.786: I/dalvikvm(128): threadid=4: reacting to signal 3
02-21 13:43:59.796: I/dalvikvm(128): Wrote stack traces to '/data/anr/traces.txt'

E il programma Android viene terminato dal sistema operativo dell'emulatore.
La cosa sorprendente è che una volta cliccato "Force close" sull'emulatore al Server Java arriva il messaggio che era stato inviato dal client Android.

L'attività android che si collega è qui di seguito:
Codice (Java): [Seleziona]
package lomba.AndroidClient;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;



public class connessioneTCP extends Activity
{
        private Button invia;
        private EditText testo;
        private String scritto;    
        private String modifiedSentence;
        private Socket clientSocket;
        private DataOutputStream outToServer;
        private BufferedReader inFromServer;
       
        public void onCreate(Bundle savedInstanceState)
        {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.invio_dati);
       
        invia = (Button) findViewById(R.id.invia);
        testo = (EditText) findViewById(R.id.testo);

                try
                {
                        clientSocket = new Socket("10.0.14.11", 6789);
                }
                catch (Exception e1)
                {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                }
               
                try
                {
                        outToServer = new DataOutputStream(clientSocket.getOutputStream());
                }
                catch (Exception e1)
                {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                }
               
                try
                {
                        inFromServer = new BufferedReader
                                                                                        (new InputStreamReader(clientSocket.getInputStream()));
                }
                catch (IOException e1)
                {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                }
         
                System.out.println("--------> Avvio client...");
       
        invia.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                try {
                                        testoScritto();
                                } catch (Exception e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                }
            }
        });
        }
       
    public void testoScritto() throws Exception
    {
        scritto = testo.getText().toString();
        System.out.println("-----> scritto:"+scritto);
                outToServer.writeBytes(scritto);
                System.out.println("-----> scritto:"+scritto);
                modifiedSentence = inFromServer.readLine();
                System.out.println("FROM SERVER: " + modifiedSentence);
                clientSocket.close();
    }
       
}

Se vi serve posterò anche il codice del server, ma quello nonc redo che abbia problemi visto che funzionava con un altro client...

Ciao a tutti





Non esistono problemi, ma solo soluzioni...

Offline ciopper90

  • Utente junior
  • **
  • Post: 106
  • Respect: +4
    • Mostra profilo
Re:Client TCP su Android
« Risposta #1 il: 21 Febbraio 2012, 14:51:39 CET »
0
la butto li..pero secondo me dovresti usare un thread :D

Offline Lomba1986

  • Utente normale
  • ***
  • Post: 173
  • Respect: +1
    • Mostra profilo
Re:Client TCP su Android
« Risposta #2 il: 21 Febbraio 2012, 14:53:41 CET »
0
però stavo ragionando...come mai un semplice client che:
_apre una connessione TCP
_invia una stringa
_chiude la connessione

non dovrebbe funzionare...è quello che con capisco
Non esistono problemi, ma solo soluzioni...

Offline ciopper90

  • Utente junior
  • **
  • Post: 106
  • Respect: +4
    • Mostra profilo
Re:Client TCP su Android
« Risposta #3 il: 21 Febbraio 2012, 14:55:32 CET »
0
però stavo ragionando...come mai un semplice client che:
_apre una connessione TCP
_invia una stringa
_chiude la connessione

non dovrebbe funzionare...è quello che con capisco
e che ci mette troppo ad eseguire quelle operazioni..quindi android la riconosce come un applicazione bloccata e te la termina :D

Offline Lomba1986

  • Utente normale
  • ***
  • Post: 173
  • Respect: +1
    • Mostra profilo
Re:Client TCP su Android
« Risposta #4 il: 21 Febbraio 2012, 14:59:29 CET »
0
Quindi potrebbe essere un NON problema, nel senso "programmi corretti, ma rete troppo lenta"?

Eppure lavorando in locale non pensavo di avere di questi problemi...nel senso, mi connetto al mi indirizzo locale

Comunque grazie a tutti
Non esistono problemi, ma solo soluzioni...

Offline ciopper90

  • Utente junior
  • **
  • Post: 106
  • Respect: +4
    • Mostra profilo
Re:Client TCP su Android
« Risposta #5 il: 21 Febbraio 2012, 15:48:36 CET »
0
Quindi potrebbe essere un NON problema, nel senso "programmi corretti, ma rete troppo lenta"?

Eppure lavorando in locale non pensavo di avere di questi problemi...nel senso, mi connetto al mi indirizzo locale

Comunque grazie a tutti
prova a vedere se con un thread funziona tanto ci vogliono 2 secondi per fare il test :D

Offline Lomba1986

  • Utente normale
  • ***
  • Post: 173
  • Respect: +1
    • Mostra profilo
Re:Client TCP su Android
« Risposta #6 il: 21 Febbraio 2012, 16:06:25 CET »
0
Intanto vi posto un'altra riga del LogCat che mi è saltata fuori ora...

02-21 15:03:48.083: D/SntpClient(60): request time failed: java.net.SocketException: Address family not supported by protocol

ma mi chiedo: com'è possibile che non supporti l'indirizzo, se la connessione al server la instaura??

Voglio dire...il server per com'è scritto segnala ogni connessione che gli arriva...e quando mi connetto dall'emulatore segnala che è arrivata una connessione...
Non esistono problemi, ma solo soluzioni...

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Client TCP su Android
« Risposta #7 il: 21 Febbraio 2012, 16:18:29 CET »
0
è un messaggio di un'altra applicazione.
Comunque, DEVI fare connessione in un thread apposito.

Offline pivoide

  • Utente junior
  • **
  • Post: 133
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Samsung galaxy tab 10.1
  • Play Store ID:
    codicerosso
  • Sistema operativo:
    Ubuntu 11.04
Re:Client TCP su Android
« Risposta #8 il: 21 Febbraio 2012, 16:28:35 CET »
0
Se va in timeout potrebbe mancare il flush del buffer sul client. Magari aggiungendolo si drizza il tutto.
outToServer.writeBytes(scritto);
outToServer.flush();

P.S: Non sarebbe più comodo anche per l'invio un printer?
PrintWriter out=new PrintWriter(s.getOutputStream());
Odio l'inglese e per un informatico non è il massimo

Offline Lomba1986

  • Utente normale
  • ***
  • Post: 173
  • Respect: +1
    • Mostra profilo
Re:Client TCP su Android
« Risposta #9 il: 21 Febbraio 2012, 16:48:21 CET »
0
Mi spiace ma nemmeno aggiungendo

outToServer.writeBytes(scritto);
outToServer.flush();

all'attività del Client funziona...  :-(

Per quanto rigurda il fare un Thread, mi chiedo perchè dovrei farlo quando:
_ Il server JAVA con client JAVA (senza android di mezzo) funziona perfettamente
_ Il corrispettivo server UDP scritto in JAVA e senza Thread funziona anche quando mi connetto dal Client Android (è la stessa filosofia o mi sbaglio?)

Ciao a tutti e grazie per l'aiuto
Non esistono problemi, ma solo soluzioni...

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:Client TCP su Android
« Risposta #10 il: 21 Febbraio 2012, 16:57:23 CET »
0
Per quanto rigurda il fare un Thread, mi chiedo perchè dovrei farlo quando:

Le linee guida dello sviluppo di applicazioni su Android dicono che per operazioni onerose, devi spostare l'operazione in un thread diverso da quello di UI (thread principale), perchè se questo thread di UI viene monopolizzato per più di 5 secondi, Android termina forzatamente l'applicazione con un "Application Not Responding - Force Close". La ragione di tutto ciò è che sui dispositivi "mobile" ci si aspetta che l'interfaccia utente sia SEMPRE responsiva, qualsiasi cosa stia facendo l'applicazione.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Lomba1986

  • Utente normale
  • ***
  • Post: 173
  • Respect: +1
    • Mostra profilo
Re:Client TCP su Android
« Risposta #11 il: 21 Febbraio 2012, 16:59:52 CET »
0
Va bene, ma aldilà delle linee guida quello che mi preme è di conoscere dove il programma fallisce...

Perdona la mia "brutalità" ma ora come ora m'interessa sapere perchè non funziona, mentre sto apprendendo i rudimenti...
Dettagli stilistici e linee guida per ora non m'interessano, però ti ringrazio della risposta :-)
Non esistono problemi, ma solo soluzioni...

Offline Lomba1986

  • Utente normale
  • ***
  • Post: 173
  • Respect: +1
    • Mostra profilo
Re:Client TCP su Android
« Risposta #12 il: 21 Febbraio 2012, 17:15:20 CET »
0
Ho provato a fare delle piccole prove...

Ho provato a cancellare le ultime due righe del client Android ossia le righe:
Codice (Java): [Seleziona]
                modifiedSentence = inFromServer.readLine();
                System.out.println("FROM SERVER: " + modifiedSentence);

e senza di queste il server TCP va in errore...

è possibile che Android in qualche modo non riesca a leggere quanto viene messo sul Buffer d'uscita del Server?

Per completezza vi posto anche il semplicissimo codice del server con cui sto facendo queste prove:

Codice (Java): [Seleziona]
class TCPServer
{
   public static void main(String argv[]) throws Exception
      {
         String clientSentence;
         String capitalizedSentence;
         ServerSocket welcomeSocket = new ServerSocket(6789);
         
         System.out.println("Avvio Server TCP...");
         
         //server per le connessioni TCP
         
         while(true)
         {
                Socket connectionSocket = welcomeSocket.accept();
                //Buffer di lettura e di scrittura
            BufferedReader inFromClient =
                                new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
            DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
                String str = "Connessione stabilita";
            outToClient.writeBytes(str);
               
            System.out.println("Connessione ricevuta da:" + connectionSocket.getInetAddress());
           
           
           
            //Lettura del buffer e risposta al Client
            System.out.println("Lettura in corso...");
            clientSentence = inFromClient.readLine();
            System.out.println("Received: " + clientSentence);
            capitalizedSentence = clientSentence.toUpperCase() + '\n';
            outToClient.writeBytes(capitalizedSentence);
            System.out.println("fine");
         }
      }
}
grazie a tutti

è da notare come il client Android non riesca nemmeno a leggere il semplice messaggio che il server gli manda "connessione stabilita"

E' possibile che vi sia un errore nella creazione del BufferedReader del Client??

Ciao a tutti
Non esistono problemi, ma solo soluzioni...

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Client TCP su Android
« Risposta #13 il: 21 Febbraio 2012, 17:37:23 CET »
0
Il metodo che chiami, ovvero la readLine è bloccante quindi il thread dove lo chiami è bloccato fino a quanto quest'ultima non termina.
Poichè il thread bloccato in questo caso è quello della UI l'activity manager si incazza.

Ti abbiamo detto già innumerevoli volte come risolvere, decidi tu se adottare o meno la soluzione proposta ma non chiedere più la stessa cosa ;)

Offline Lomba1986

  • Utente normale
  • ***
  • Post: 173
  • Respect: +1
    • Mostra profilo
Re:Client TCP su Android
« Risposta #14 il: 22 Febbraio 2012, 09:24:46 CET »
0
Ricky ti ringrazio veramente per le risposte, ma come sicuramente avrai notato l'ultimo mio post era una domanda leggermente differente...

Forse non mi sono spiegato bene: vorrei sapere come mai togliendo quelle righe di codice dal Client Android anche il server JAVA crasha... e come mai il client Android non riesce a leggere lo stream d'ingresso, quando facendo la cosa analoga con UDP funziona tutto perfettamente. E' un di lettura; che fosse bloccate lo avevo capito, quello che mi sfugge è PERCHè non riesce a leggere lo stream d'ingresso...

Non esistono problemi, ma solo soluzioni...