2014-02-22 3 views
2

데이터를 Java 서버로 보내는 Android 클라이언트가 있습니다. 일부 서버 프로세스가 끝나면 서버가 클라이언트에 응답하기를 원하지만 작동하지 못합니다.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

관련 문제