2012-01-04 73 views
2

我有一臺PC服務器和一個android客戶端;我的android客戶端啓動到服務器的套接字連接。android:TCP連接性能

雖然我連接到服務器,我也接收數據從服務器到Android客戶端;

這裏是我的代碼:

Socket socket = null; 
DataOutputStream out = null; 
DataInputStream in = null; 
InputStream inputStream = null; 
OutputStream outputStream = null; 
... 

public void connectToTCP() 
     { 

      try 
      { 
       socket = new Socket(HOST_ADDRESS, PORT); 

       socket.setSoTimeout(30000); 
       outputStream = socket.getOutputStream(); 
       out = new DataOutputStream(outputStream); 
       inputStream = socket.getInputStream(); 
       in = new DataInputStream(inputStream); 

       Log.e("TCP-", "Connected"); 

       while (socket.isConnected()){readBytes();} 
      } 
      catch (UnknownHostException e) 
      { 

       Log.e("Error in tcp connection","Unknown Host"); 

      } 
      catch (IOException e) 
      { 

       Log.e("Error in tcp connection", "Couldn't get I/O for the connection"); 

      } 
     } 

    public void readBytes() throws IOException 
     { 
      if (in.available() > 0) 
      { 
       byte[] buffer = new byte[in.available()]; 
       if (buffer.length > 0) 
       { 
        if (mListener != null) 
        { 
         int numberOfBytes = in.read(buffer); 
         mListener.tcpConnectionDataReceived(buffer, numberOfBytes); 
        } 
       } 
      } 
     } 

但我的問題是性能。我測試了設備上的代碼,並注意到(來自任務管理器)該應用程序消耗大量資源(CPU使用率超過50%),但是當我通過刪除此循環而停止從套接字讀取時while (socket.isConnected()){readBytes();} CPU使用率變得小於1%。

任何想法來解決這個問題?

回答

4

如果沒有數據可用,您將立即返回readBytes()方法。由於它處於一個緊密的循環中,你基本上會不斷地檢查是否有可用的東西,從而浪費了大量的CPU資源。用你顯示的代碼,你最好做一個普通的阻塞讀取(即完全刪除available()檢查,並使用一個合理的,固定大小的緩衝區)。

2

您應該在呼叫readBytes()之間休息 - 如果沒有可用的數據,您基本上會創建一個無限循環,因此in.available() > 0爲假。

或者,如果這是在它自己的後臺線程中,只要在知道需要更多數據時進行阻塞讀取。