2012-12-07 168 views
2

我在做一個需要與TCP套接字進行通信的應用程序。我建立了一個服務,這是我的TCP服務器和一個活動,這是我的TCP客戶端。Android TCP套接字超時

我有一個很大的延遲從發送消息和接收服務器的答案,如10秒或更多秒。經過幾天的研究,我發現如何在客戶端請求上設置超時時間,並且一切都開始正常工作。

所以我的問題是,是否必須爲TCP連接設置超時,否則它不起作用或者其他錯誤與我的實現?

這裏是我的客戶端代碼:

public static void sendTCP(final InetAddress senderAddr, final String Msg, final int serverPort) { 
     Thread tclient = new Thread(){ 
      public void run() { 
       boolean connected; 
       Socket socket = new Socket(); 
       try { 
        Log.d("TCP", "Client: Connecting..."); 
        socket.bind(null); 
        socket.connect((new InetSocketAddress(senderAddr, serverPort)), 1000); 
        connected = true; 
       try { 
        Log.d("TCP", "Client: Sending command."); 
        PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); 
        out.println(Msg); 
        out.close(); 
       } 
       catch (Exception e) { 
        Log.e("TCP", "Client: Error sending.", e); 
       } 
       } catch (Exception e) { 
        Log.e("TCP", "Client: Error connecting.", e); 
        connected = false; 
       } 
       finally { 
        if (socket != null) { 
         if (socket.isConnected()) { 
          try { 
           socket.close(); 
           Log.d("TCP", "Client: Connection Closed."); 
          } catch (IOException e) { 
           Log.e("TCP", "Client: Error closing connection.", e); 
          } 
         } 
        } 
       } 
      } 
     }; 
     tclient.start(); 
    } 

機和服務器的:

public void onStart(Intent intent, int startid) { 

    t = new Thread(){ 
     public void run() { 
      try { 
       Boolean end = false; 
       Log.d("TCP", "Server: Creating server."); 
       ServerSocket ss = new ServerSocket(TCPPORT); 
       while(!end) { 
        //Server is waiting for client here, if needed 
        Log.d("TCP", "Server: Waiting on packet!"); 
        Socket s = ss.accept(); 
        BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream())); 
        String st = input.readLine(); 
        Log.d("TCP", "Server: Message received from client: "+st); 

        InetAddress senderAddr = s.getInetAddress(); 
        senderAddrString= senderAddr.getHostAddress(); 

        myAddrString = GetLocalIpAddress(); 
        myAddr = InetAddress.getByName(myAddrString); 

        if (senderAddr.equals(myAddr)) { 
        } 
        else { 
         //Estraggo dal pacchetto ricevuto 
         try { 
          StringTokenizer tokens = new StringTokenizer(st, "|"); 
          flag = tokens.nextToken(); 
          userid = tokens.nextToken(); 
          payload = tokens.nextToken(); 
         } 
         catch (Exception e) { 
          Log.e("TCP", "Server: Errore estrazione dati."); 
         } 

         if (flag.equals(Constants.flag_scan_answer)) { 
          Log.d("TCP", "Server: Flag answer"); 
          //devo passare i dati ad un database ScanActivity 

          //database(senderAddrString,userid); 

          System.out.println("RISPOSTA RICEVUTA DAL SERVICE TCP"); 
          System.out.println("FLAG " + flag); 
          System.out.println("USERID " + userid); 
          System.out.println("PAYLOAD " + payload); 

          announceReceivingPacket(); 
         } 

         else { 
          Log.d("TCP", "Server: CASO NON PREVISTO"); 
         } 
        } 
        s.close(); 
       } 
      } 
      catch (UnknownHostException e) { 
        e.printStackTrace(); 
      } 
      catch (IOException e) { 
        e.printStackTrace(); 
      } 
     } 
    }; 
    t.start(); 
} 

回答

2

這是強制性的,以建立超時TCP連接

它不是強制性的,但這是一個非常好的主意。首先將其設置爲預期服務時間的兩倍或三倍,然後進行調整,以避免誤報。默認的讀取超時是無限的,並且我看到整個平臺的失敗方式是讀取器無法以超出讀取超時的方式檢測到的。

查看here的相關報價。