Autore Topic: Android, socket e broken pipe??  (Letto 374 volte)

Offline DarKprince

  • Nuovo arrivato
  • *
  • Post: 24
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S
  • Market Developer Name:
    Saverio Guardato
  • Sistema operativo:
    Windows 7, Ubuntu 10.10
Android, socket e broken pipe??
« il: 03 Marzo 2011, 14:28:41 CET »
0
Ciao a tutti, sto sviluppando una parte di connessione su un app che richiede la connessione ad un server per lo scambio di alcuni messaggi. La situazione è questa:

telefono: connessione socket al server --->invio messaggio iniziale --->resto in attesa di risposte e invia periodicamente un PING
server: riceve messaggio di richiesta--->invia risposta di avvenuta connessione---> invia messaggi in base a N eventi

il problema che sto riscontrando è che dopo un TOT di tempo (non sono sicuro che sia randomico) la connessione sul telefono muore, e dal debug leggo broken pipe

ecco cosa faccio nella classe:
Codice (Java): [Seleziona]
public void run(){
                        Log.d(TAG, "[run]Connessione a "+hostname+" sulla porta "+port);
                        try {
                                addr = InetAddress.getByName(hostname);
                                //apro la socket
                                mSocket = new Socket(addr, port);
                               
                                //flussi derivanti dalla socket
                                in = new DataInputStream(mSocket.getInputStream());
                                out = new DataOutputStream(mSocket.getOutputStream()); 

                                Log.d(TAG, "Nessun problema sulla socket");

                                //prima richiesta GET per la ricezione dei messaggi
                                String get_request = "GET /"+loginS+"/stream?android=3.0\n\n";
                                writeServer(get_request);

                                Log.d(TAG, "In attesa di risposta");
                                String  line = "";
                                int c = 0;
                                while (c != -1) {
                                        c = in.read();
                                        if (c == 0) {
                                                try {
                                                        Thread.sleep(2500);
                                                } catch (InterruptedException e) {e.printStackTrace();}
                                                continue;
                                        }
                                        if ( c != '\n')
                                                line = line + (char)c;
                                        else {
                                                dataHandler( line );
                                                line = "";
                                        }
                                }
                        }
                        catch(Exception ex){
                                ex.printStackTrace();
                                Log.e(TAG, "[Socket] Si è verificato un errore,"+ex.getLocalizedMessage());
                        }finally{ closeAll();}

writeserver è un semplice metodo che fa
Codice (Java): [Seleziona]
out.write(buffer.getBytes());  
                        out.flush();

qualcuno ha esperienza a riguardo?? grazie

Offline MarcoDuff

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 941
  • Respect: +156
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    HTC Desire
  • Market Developer Name:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Android, socket e broken pipe??
« Risposta #1 il: 04 Marzo 2011, 12:20:25 CET »
0
Metti il logcat con l'errore.
Le mie Applicazioni Android | Il mio Blog

Io faccio parte del Gruppo AndDev.it LOGTFO, tu no? Allora GTFO!
Quando un utente fornisce una risposta utile si può ringraziarlo premendo il tasto  alla destra del titolo del post. (Ricky` rulez)

Offline DarKprince

  • Nuovo arrivato
  • *
  • Post: 24
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S
  • Market Developer Name:
    Saverio Guardato
  • Sistema operativo:
    Windows 7, Ubuntu 10.10
Re:Android, socket e broken pipe??
« Risposta #2 il: 04 Marzo 2011, 12:25:00 CET »
0
l'errore che da è:
Codice: [Seleziona]
java.net.SocketException
MESSAGE: Broken pipe

STACKTRACE:

java.net.SocketException: Broken pipe
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java(Compiled Code))
at java.net.SocketOutputStream.write(SocketOutputStream.java(Compiled Code))
....
....
...

la riga a cui si riferisce è quella relativa all'invocazione del metodo writeServer

da
Codice (Java): [Seleziona]
        public boolean Ping(){
                Log.d(TAG, "Invio il PING");
                if(writeServer("GET /ping")) return true;
                else return false;
        }

chiamo Ping da un'altra classe allo scadere di un timeout
« Ultima modifica: 04 Marzo 2011, 12:27:14 CET da DarKprince »

Offline MarcoDuff

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 941
  • Respect: +156
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    HTC Desire
  • Market Developer Name:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Android, socket e broken pipe??
« Risposta #3 il: 04 Marzo 2011, 12:55:12 CET »
0
Secondo me il problema è li, prova a sostituire questo codice con questo e poi prova a mettere una linea di debug vicino all'istruzione in modo da capire se la variabile che hai definito viene inizializzata con questo valore o con un altro valore.

Se non hai capito come risolvere il problema mettiti nei panni di chi ti sta aiutando e non può capire il tuo problema visto che gli mancano informazioni fondamentali come il logcat completo, quando viene chiamato il metodo Ping, a cosa si riferisce la variabile out del metodo Ping, a cosa si riferisce la variabile buffer, cosa fa il metodo closeAll e tanti, tanti, tanti altri problemi.
Le mie Applicazioni Android | Il mio Blog

Io faccio parte del Gruppo AndDev.it LOGTFO, tu no? Allora GTFO!
Quando un utente fornisce una risposta utile si può ringraziarlo premendo il tasto  alla destra del titolo del post. (Ricky` rulez)