2012-12-07 169 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的相关报价。