2014-02-22 95 views
2

我有一個Android客戶端,它將數據發送到Java服務器。在某個服務器進程之後,我希望服務器回覆客戶端,但我無法開始工作。Android客戶端沒有得到服務器回覆

起初,客戶端和服務器都卡在readLine()上,所以我加了\n兩者,但仍然沒有變化。在這裏進行了長時間的搜索之後,我嘗試關閉客戶端連接,然後服務器運行,但由於套接字已關閉,客戶端發出錯誤。什麼是正確的做法,爲什麼?

客戶端代碼:

private class sendToServer extends AsyncTask<JSONObject, Void, String> { 
    @Override 
    protected String doInBackground(JSONObject... userData) { 
     Socket clientSocket; 
     try { 
      clientSocket = new Socket("10.0.2.2", 7878); 
      BufferedOutputStream outToServer = new BufferedOutputStream(clientSocket.getOutputStream()); 
      outToServer.write((userData[0].toString() + '\n').getBytes()); 
      outToServer.flush(); 

      BufferedReader inFromServer = new BufferedReader(new Inpu tStreamReader(clientSocket.getInputStream())); 
      String reply = inFromServer.readLine(); 

      outToServer.close(); 
       Log.d("",reply); 

      inFromServer.close(); 
      clientSocket.close(); 

     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
} 

服務器代碼:

@Override 
public void run() { 
    try { 
     BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
     StringBuilder builder = new StringBuilder(); 
     String line; 
     while ((line = inFromClient.readLine()) != null) 
       builder.append(line); 

     BufferedOutputStream outToClient = new BufferedOutputStream(connection.getOutputStream()); 
     outToClient.write(("ACK" + '\n').getBytes()); 
     outToClient.flush(); 

      inFromClient.close();   
      putToClient.close(); 

     parseIncomingData(builder.toString()); 

    } catch (Exception e) { 
     System.out.println(e); 
    } finally { 
     try { 
      connection.close(); 
     } catch (IOException e) { 
      System.out.println(e); 
     } 
    } 
} 

回答

0

它看起來像你的服務器是怎麼回事,直到返回null來繼續讀線。直到流被另一端關閉,纔會發生這種情況。作爲測試,只需執行一個readLine(擺脫while循環)並查看一切消息是否適用。

或者,你可以從客戶端發送一個空字符串作爲最後一個字符串 - 然後你可以檢查服務器上的這個「特殊」字符串或空字符串以打破這個時間readline循環。

+0

是的,它工作,如果我只讀一行。謝謝。 – user3339411