2010-07-19 4 views
0

저는 유닉스 소켓을 사용하여 C 및 UNIX에서 실행중인 시스템 레벨 데몬과 Java로 실행중인 응용 프로그램 간의 통신을 용이하게합니다. Java 코더보다 C 코더가 더 많아서 Java 측 소켓에서 데이터를 읽을 때 몇 가지 문제가 있습니다. 다음과 같이 현재 내 코드는 다음과 같습니다 내 댓글 알 수 있듯이LocalSocket 읽기 크기 결정

try{//Prepare to write the command and read the ACK 
    InputStream is = receiver.getInputStream(); 
    OutputStream os = receiver.getOutputStream(); 
    BufferedReader in = new BufferedReader(new InputStreamReader(is)); 

    os.write(message.getBytes()); 

    //FIX THIS!! The following assumes that there is a newline- 
    // terminated chunk of data waiting for us in the buffer. If 
    // that assumption is wrong, the code will hang. Find some way 
    // to determine if/how much data is waiting for us in the socket! 
    String str = in.readLine(); 

    is.close(); 
    os.close(); 
    receiver.close(); 
    return str; 
}catch(IOException ex){ 
    Log.e(TAG,(ex.toString()+"\n")); 
    return null; 
} 

,이 구현은 (틱) 작동하지만, 줄 바꿈이 문자열을 종료와 서버 측 소켓 코드가 응답하도록 요구하는 아주 나쁜 설계 결함이 있습니다. 그렇지 않은 경우 세상이 끝납니다.

내가 알아 내려고하는 것은이 작업을 수행하는 더 좋은 방법이 있는지입니다. 버퍼링 된 판독기에서 읽을 대기중인 데이터가 있는지 확인할 수 있습니까? 그렇다면 해당 데이터의 크기는 얼마입니까? 그렇지 않다면 안다는 자바 측 유닉스 소켓을 통해 데이터를 읽는 더 좋은 방법이 있을까? 사전에

감사합니다!

답변

0

프로토콜에 개행이 필요한 경우 impl이 적절합니다. 코드는 개행 문자가 읽혀질 때까지 차단되어야합니다 (SHOULD). 그 외에 뭘 할 수 있니?

물론, 보통 영원히 기다리지 않으려면 시간 초과가 필요합니다. 줄 바꿈은 반드시 서버가 지정되지 않는 경우는 Socket.setSoTimeout()

을보고, 당신은 즉시 사용할 수 등의 데이터를 읽고 싶어, InputStream.read()

+0

감사를 사용! 내가 궁금한 또 다른 점은 InputStream 클래스의 available() 함수에 주목했다는 것입니다. 그것을 read()와 결합하면 이 나옵니다. (is.available()! = 0) str + = (char) is.read(); return str; available()의 설명에서 "추정 된"이라는 단어는 나에게 약간의 신뢰감을 줄 수 있습니까? –

+0

available() == 0은 스트림의 끝을 의미하지 않습니다. read() == - 1은 그 것을 의미합니다. available()이 필요하지 않을 것입니다. – irreputable

+0

당신은 read() == -1가 UNIX 소켓의 스트림 끝임을 확신합니까? 내 현재 스 니펫은 입니다. int readByte = is.read(); while (readByte! = -1) { str + = (char) readByte; readByte = is.read(); } 하지만 -1이 읽히기 전에 시간 초과가 된 것처럼 보입니다. 적어도, 나는 그것이 실제로 일어난다는 것을 시간을 내고 있다고 가정하고있다. 나의 어플리케이션 클린업이 홈 스크린으로 돌아가고, cat vomits가 모든 곳으로 출력된다. 특히, LocalSocket이 호출하는 JNI 메서드에서 예외를 throw하고, 거대한 스택 추적, Dalvik 중단 및 많은 메모리 주소 매핑 정보가 뒤 따른다. –

관련 문제