저는 유닉스 소켓을 사용하여 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;
}
,이 구현은 (틱) 작동하지만, 줄 바꿈이 문자열을 종료와 서버 측 소켓 코드가 응답하도록 요구하는 아주 나쁜 설계 결함이 있습니다. 그렇지 않은 경우 세상이 끝납니다.
내가 알아 내려고하는 것은이 작업을 수행하는 더 좋은 방법이 있는지입니다. 버퍼링 된 판독기에서 읽을 대기중인 데이터가 있는지 확인할 수 있습니까? 그렇다면 해당 데이터의 크기는 얼마입니까? 그렇지 않다면 안다는 자바 측 유닉스 소켓을 통해 데이터를 읽는 더 좋은 방법이 있을까? 사전에
감사합니다!
감사를 사용! 내가 궁금한 또 다른 점은 InputStream 클래스의 available() 함수에 주목했다는 것입니다. 그것을 read()와 결합하면 이 나옵니다. (is.available()! = 0) str + = (char) is.read(); return str; available()의 설명에서 "추정 된"이라는 단어는 나에게 약간의 신뢰감을 줄 수 있습니까? –
available() == 0은 스트림의 끝을 의미하지 않습니다. read() == - 1은 그 것을 의미합니다. available()이 필요하지 않을 것입니다. – irreputable
당신은 read() == -1가 UNIX 소켓의 스트림 끝임을 확신합니까? 내 현재 스 니펫은 입니다. int readByte = is.read(); while (readByte! = -1) { str + = (char) readByte; readByte = is.read(); } 하지만 -1이 읽히기 전에 시간 초과가 된 것처럼 보입니다. 적어도, 나는 그것이 실제로 일어난다는 것을 시간을 내고 있다고 가정하고있다. 나의 어플리케이션 클린업이 홈 스크린으로 돌아가고, cat vomits가 모든 곳으로 출력된다. 특히, LocalSocket이 호출하는 JNI 메서드에서 예외를 throw하고, 거대한 스택 추적, Dalvik 중단 및 많은 메모리 주소 매핑 정보가 뒤 따른다. –