2012-02-24 4 views
0

응용 프로그램은 두 부분으로 구성되어 있습니다. 서버 부분은 Linux 컴퓨터에서 실행됩니다. 클라이언트 부분 인 Android 애플리케이션은 서버를 쿼리하고 필요한 응답을받습니다. 두 부분 모두 Java로 작성되고 소켓 기반 통신을 사용하며 텍스트 데이터를 전송합니다.소켓 데이터를 읽을 수있는 신뢰할 수있는 방법

public static String ReadAvailableTextFromSocket(BufferedReader input) throws IOException { 
    if (input.ready() == false) { 
    return null; 
    } 
    StringBuilder retVal = new StringBuilder(); 
    while(input.ready()) { 
    char ch = (char) input.read(); 
    retVal.append(ch); 
    } 
    return retVal.toString(); 
} 

그러나, 그 신뢰성이 될 것 같지 않습니다 :

오른쪽 요청을 전송 한 후, 여기에 클라이언트가 응답을 수신하는 방법입니다. 입력이 서버 응답 시간 또는 전송 지연으로 인해 항상 준비되지는 않습니다.

처럼 보입니다. input.ready()는 데이터 가져 오기를 기다리는 올바른 방법이 아닙니다.

이 작업을 수행하는 더 좋은 방법이 있는지 궁금합니다. 아마도 내가 사용할 수있는 몇 가지 표준 연습이있을 것입니다.

답변

0

아마도 Threads을 사용해야합니다. 더 많은 데이터를 읽는 루프 인 while(true) 루프에 리스너 스레드를 유지하고 데이터 구조 (대기열이라고합시다)의 데이터를 주 스레드와 공유합니다. 그렇게하면 주 스레드가 필요에 따라 단순히 데이터를 큐에서 제거 할 수 있습니다. 대기열이 비어 있으면 새로운 데이터가 수신되지 않았 음을 유추 할 수 있습니다.

편집 : 예를 들어 multithreaded chat server/client 코드를 참조하십시오.

+0

감사합니다. 데이터는 현재 백그라운드 스레드에서 수신 중입니다. 그러나 문제는 여전히 사라지지 않는다고 생각합니다. 백그라운드 나 포 그라운드 중 일부 스레드는 특정 시간을 기다린 다음 데이터가 오지 않을 것이라고 결정해야합니다. 나는 단지 얼마나 오래 기다려야하는지에 대한 개념을 소개해야 할지도 모른다. – Peter

0

다음은이 문제를 해결 한 방법입니다. 클라이언트 쪽과 서버 쪽 모두를 작성하는 책임이 있으므로 요청이 서버에 도착하면 응답으로 보내는 첫 번째 줄은 클라이언트가 기대할 수있는 바이트 수입니다. 이렇게하면 클라이언트는 먼저 줄을 읽으려고 대기합니다. 회선을 읽으면 클라이언트는 이제 서버에서 예상되는 데이터의 바이트 수를 알 수 있습니다.

다른 사람들에게 도움이되기를 바랍니다.

감사합니다.
Peter

관련 문제