2012-04-10 89 views
0

我試着用用Telnet。 Android的,掛在發送

adb shell 
$telnet 172.20.104.203 5334 
$h 

它返回的命令小時數據遠程登錄時,通過遠程登錄到計算機,然後將命令發送到串行端口,發送命令,怎麼過當我嘗試使用android連接到套接字時,我可以在計算機上看到它,它會發送命令,但是一旦它發出日誌,它就發送它掛起並提出「應用程序沒有響應」已經等待或強迫關閉,如果我等待它就保持不變。

這是我爲Telnet部分

private static final int TCP_SERVER_PORT = 5334; 

    private void runTcpClient() { 
     try { 
      Socket s = new Socket("172.20.104.203", TCP_SERVER_PORT); 
      BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream())); 
      BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); 
      //send output msg 
      String outMsg = "$getPos"; 
      out.write(outMsg); 
      out.flush(); 
      Log.i("TcpClient", "sent: " + outMsg); 
      //accept server response 
      String inMsg = in.readLine() + System.getProperty("line.separator"); 
      Log.i("TcpClient", "received: " + inMsg); 
      //close connection 
      s.close(); 
     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

它記錄發送代碼,但它從來沒有日誌收到,我想這可能是是與所接收到的數據,所以我剛剛發送量

$getPos 

取而代之,它仍然掛起。

任何人都知道會發生什麼?

回答

0

我對平臺的細節並不熟悉,但readline在socket/tcp流上工作的可能性不大,或者如果工作正常,它將不可靠地工作。從套接字進入的數據不一定組織成'行',而是具有特定大小的數據包。在套接字上執行的「讀取」將返回一定數量的字節。

做這種讀取的客戶端需要讀取每個數據包,緩衝它們,直到它收到一個商定的「數據結束」標記。議定的標記由協議確定。

您向我們展示了您的代碼的客戶端。你有相應的服務器端嗎?

從你在這裏,我的猜想是你的客戶端代碼耐心等待'由於某種原因,永遠不會來'的'行尾'。或者服務器端有問題,而服務器沒有向客戶端發送任何數據。

+0

發生了什麼事情是讀者還沒有什麼要讀,我需要用一段時間(in.ready()&&(line = in.readLine())!= null)行來替換它這樣做,而讀者有數據要讀取這個出來罰款,在每一行數據的實際行方面,其結束等待行分隔符 – FabianCook 2012-05-04 11:47:57

+0

啊正確。我忘了提及您需要檢查流中是否有數據可供檢索。 :) – Iain 2012-05-04 12:52:25

+0

是的:D,我完成了我需要的項目:D涉及大量傳入數據。 – FabianCook 2012-05-04 12:53:17