2015-05-21 15 views
5

La mia app Android è connessa al server tramite socket, codificata in node.js. Quando viene lasciato in primo piano per 15 minuti, perde la connessione al server. Quello che segue è il codice che collega il sockt al serverTimeout connessione socket Android

public void connect() { 
    this.connectionStatus = CONNECT_STATUS_CONNECTING; 
    Log.v(AppConstants.DEBUG_TAG, userId + " : Connecting to Server"); 
    if (mThread != null && mThread.isAlive()) { 
     return; 
    } 
    mThread = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       Log.v(AppConstants.DEBUG_TAG, userId + " : Thread Action Started"); 
       String secret = createSecret(); 

       int port = (mURI.getPort() != -1) ? mURI.getPort() : (mURI.getScheme().equals("wss") ? 443 : 80); 

       String path = TextUtils.isEmpty(mURI.getPath()) ? "/" : mURI.getPath(); 
       if (!TextUtils.isEmpty(mURI.getQuery())) { 
        path += "?" + mURI.getQuery(); 
       } 
       String originScheme = mURI.getScheme().equals("wss") ? "https" : "http"; 
       URI origin = new URI(originScheme, "//" + mURI.getHost(), null); 

       SocketFactory factory = mURI.getScheme().equals("wss") ? getSSLSocketFactory() : SocketFactory.getDefault(); 
       mSocket = factory.createSocket(mURI.getHost(), port); 
       mSocket.setKeepAlive(true); 


       PrintWriter out = new PrintWriter(mSocket.getOutputStream()); 
       out.print("GET " + path + " HTTP/1.1\r\n"); 
       out.print("Upgrade: websocket\r\n"); 
       out.print("Connection: Upgrade\r\n"); 
       out.print("Host: " + mURI.getHost() + "\r\n"); 
       out.print("Origin: " + origin.toString() + "\r\n"); 
       out.print("Sec-WebSocket-Key: " + secret + "\r\n"); 
       out.print("Sec-WebSocket-Version: 13\r\n"); 
       if (mExtraHeaders != null) { 
        for (NameValuePair pair : mExtraHeaders) { 
         out.print(String.format("%s: %s\r\n", pair.getName(), pair.getValue())); 
        } 
       } 
       out.print("\r\n"); 
       out.flush(); 

       HybiParser.HappyDataInputStream stream = new HybiParser.HappyDataInputStream(mSocket.getInputStream()); 

       // Read HTTP response status line. 
       StatusLine statusLine = parseStatusLine(readLine(stream)); 
       if (statusLine == null) { 
        Log.v(AppConstants.DEBUG_TAG, "Received no reply from server."); 
        throw new HttpException("Received no reply from server."); 
       } else if (statusLine.getStatusCode() != HttpStatus.SC_SWITCHING_PROTOCOLS) { 
        throw new HttpResponseException(statusLine.getStatusCode(), statusLine.getReasonPhrase()); 
       } 

       // Read HTTP response headers. 
       String line; 
       boolean validated = false; 

       while (!TextUtils.isEmpty(line = readLine(stream))) { 
        Header header = parseHeader(line); 
        if (header.getName().equals("Sec-WebSocket-Accept")) { 
         String expected = createSecretValidation(secret); 
         String actual = header.getValue().trim(); 

         if (!expected.equals(actual)) { 
          Log.v(AppConstants.DEBUG_TAG, "Bad Sec-WebSocket-Accept header value."); 
          throw new HttpException("Bad Sec-WebSocket-Accept header value."); 
         } 
         validated = true; 
        } 
       } 

       if (!validated) { 
        Log.v(AppConstants.DEBUG_TAG, "No Sec-WebSocket-Accept header."); 
        throw new HttpException("No Sec-WebSocket-Accept header."); 
       } 
       onConnect(); 
       Log.v(AppConstants.DEBUG_TAG, userId + " : Thread should be connected by now"); 
       // Now decode websocket frames. 
       mParser.start(stream); 
      } catch (EOFException ex) { 
       Log.d(AppConstants.DEBUG_TAG, "WebSocket EOF!", ex); 
       onDisconnect(0, "EOF"); 
      } catch (SSLException ex) { 
       // Connection reset by peer 
       Log.d(AppConstants.DEBUG_TAG, "Websocket SSL error!", ex); 
       onDisconnect(0, "SSL"); 
      } catch (Exception ex) { 
       onError(ex); 
      } 
     } 
    }); 
    Log.v(AppConstants.DEBUG_TAG, userId + " : Thread about to be started"); 
    mThread.start(); 
} 

anu soluzione a questo problema?

risposta

7

Dopo aver cercato su Google ho trovato una soluzione a questo problema. Aggiungi timeout alla connessione socket.

mSocket.setSoTimeout(10000); 

se non v'è alcuna risposta, per 10 secondi, si getterà SocketTimeoutException e nella cattura di questa eccezione chiudere la connessione, se esiste, quindi collegare di nuovo.

catch (SocketTimeoutException e){ 
       if(mSocket.isConnected()){ 
        disconnect(); 
       } 
       connect(); 
      }