내 주요 응용 프로그램에서 별도의 스레드에서이 같은 ServerSocket
에 쓰고 있어요 방울 : queue
가 외부로부터 채워됩니다의 BufferedReader 라인
BlockingQueue<String> queue = new Queue<>();
// THREAD
ServerSocket server = new ServerSocket(2222);
Socket socket = server.accept();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),"UTF-8"));
while (true) {
String line = queue.take();
if (line != null) {
try {
logger.debug("Sending command " + line);
writer.write(line + "\n");
writer.flush();
} catch (IOException e) {
logger.error("IO error", e);
e.printStackTrace();
}
}
}
.
보내 주신 내용은 정상적으로 작동하며 포트 2222에서 텔넷을 사용하고 디버그 로거 출력을 읽음으로써이를 확인할 수 있습니다. 나는 다음과 같은 코드를 통해 포트 2222에 읽고 있어요 안드로이드에
: 모든 몇 가지 메시지에
Socket s = new Socket("host",2222);
BufferedReader reader = new BufferedReader(new InputStreamReader(s.getInputStream(),"UTF-8"));
while((line = reader.readLine()) != null) {
Log.d("PAINT","RECEIVED::" + line);
// create Message, Bundle, send Message to handler.
}
그러나 하나 (추천 10) 나는 안드로이드 전화로 접수되지 않습니다 보냅니다. 이것이 일어날 수있는 방법에 대한 힌트와 어떻게 해결할 수 있을까요?
'Queue'은 스레드로부터 안전하지 않습니까? 당신은 당신이 그것을 기대하는 것처럼 그것을 사용하는 것 같습니다. –
좋은 지적이지만, 우리가이 문제를 해결해야하는 것은 문제가되지 않는 것 같습니다. andoid 스레드가 읽기를 등록하지 않을 때마다 쓰기를 기록합니다. –
'java.util.concurrent'에서 콜렉션 중 하나를 사용하십시오. 만약 당신이'LinkedBlockingQueue'와 같은'BlockingQueue'를 사용한다면 당신은 당신이 사용하고있는 것으로 보이는 끔찍한 busy-wait 반 패턴을 제거 할 수 있습니다. –