2015-05-21 20 views
5

Ứng dụng android của tôi được kết nối với máy chủ thông qua socket, được mã hóa trong node.js. Khi bị bỏ lại trong nền trước trong 15 phút, nó sẽ mất kết nối với máy chủ. Sau đây là mã kết nối sockt với máy chủThời gian chờ kết nối 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(); 
} 

giải pháp anu cho vấn đề này?

Trả lời

7

Sau khi googling rất nhiều tôi phát hiện ra một giải pháp cho vấn đề này. Thêm thời gian chờ vào kết nối ổ cắm.

mSocket.setSoTimeout(10000); 

nếu không có bất kỳ phản hồi nào, trong 10 giây, nó sẽ ném ra SocketTimeoutException và trong trường hợp ngoại lệ này đóng kết nối nếu có, sau đó kết nối lại.

catch (SocketTimeoutException e){ 
       if(mSocket.isConnected()){ 
        disconnect(); 
       } 
       connect(); 
      } 
Các vấn đề liên quan