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

Offline DarKprince

  • Nuovo arrivato
  • *
  • Post: 24
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S
  • Play Store ID:
    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 storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    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.

Offline DarKprince

  • Nuovo arrivato
  • *
  • Post: 24
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S
  • Play Store ID:
    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 storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    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.