2011-05-23 67 views
0

這是我的代碼:插座較長的讀取數據

private String receiveData(String sjson) { 
     Log.i(TAG,"send request: " + sjson); 
     String jstr=""; 
     try { 
      OutputStream out = s.getOutputStream(); 
      out.write(sjson.getBytes()); 
      out.flush(); 
      //out.close(); 
      Log.v(TAG,"sended data"); 
      BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream())); 
      char[] cbuf = new char[1]; 
      input.read(cbuf);     
      String size = new String(cbuf); 
      while (input.read(cbuf) != 0) { 
       if((new String(cbuf)).equals("{") == true) 
        break; 
       size = size + new String(cbuf); 
      } 
      char[] jbuf = new char[Integer.valueOf(size)]; 
      input.read(jbuf); 
      jstr = "{" + new String(jbuf); 
     }catch (Exception e) { 
      Log.e(TAG,e.toString()); 
     } 
     Log.d(TAG,"responce: " + jstr); 
     return jstr; 
    } 

    public void connectSocket() { 
     Log.v(TAG,"connecting Socket: "+URL+":"+PORT); 
     try { 
      s = new Socket(URL, PORT); 
      Log.v(TAG,"connect Socket!"); 
      ERROR_CODE = 0; 
     }catch (Exception e) { 
      Log.e(TAG,e.toString()); 
      ERROR_CODE = ERROR_SOCKET_CONNECT_SUCCESSFULL; 
     } 
     Log.e(TAG,getErrorMsg(ERROR_CODE)); 
    } 

    public void closeSocket() { 
     Log.v(TAG,"closeSocket"); 
     try { 
      s.close(); 
     }catch (Exception e) { 
      Log.e(TAG,e.toString()); 
     } 
    } 

在服務器上的答案是不到一秒鐘。在客戶端讀取數據前1分鐘。

停止應用程序在input.read(cbuf);等待答覆。

日誌:

05-23 06:35:17.540: VERBOSE/Utilits(358): Auth: 77.221.129.100:10598 
05-23 06:35:17.660: INFO/Utilits(358): send request: 0119{"data":{"password":"12345","imei":"000000000000001"},"method":"login"} 
05-23 06:36:17.909: DEBUG/Utilits(358): responce: {"response":{"success":true,"user":{"id":"6","properties":{"auto":"model":"audi","color":"ffff","number":"td123r"}},"is_driver":"1"}}} 

爲什麼要花那麼長時間閱讀的答案嗎?

回答

1

你預計該方法做什麼?它有一些缺陷,它會做它應該做的事情。

  • 當您創建InputStreamReader中應指定編碼/字符集
  • 爲什麼你的角色從開始讀取字符「{」
  • 你爲什麼要爲每一個字符的字符串,你在你面前讀點擊「{」
  • 爲什麼你要在循環中追加字符串?如果您必須追加,請使用StringBuilder。
  • input.read返回一個整數,表示您已收到多少個字節/字符 它永遠不會保證它將填充緩衝區。所以你可能無法獲得所有數據。
  • 你爲什麼不關閉資源?

..現在爲什麼它可能會很慢。服務器是否沖洗數據?如果沒有,請確保服務器正在刷新數據。

+0

謝謝,我都糾正了。服務器正在刷新數據,在這個問題。我注意到什麼時,我讀1個字節,然後數據讀取1秒。 但後來我讀了2個字節,然後數據redind 1分鐘。 – alezhka 2011-05-24 10:18:32