2013-06-17 3 views
-1

내 주요 응용 프로그램에서 별도의 스레드에서이 같은 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) 나는 안드로이드 전화로 접수되지 않습니다 보냅니다. 이것이 일어날 수있는 방법에 대한 힌트와 어떻게 해결할 수 있을까요?

+3

'Queue '은 스레드로부터 안전하지 않습니까? 당신은 당신이 그것을 기대하는 것처럼 그것을 사용하는 것 같습니다. –

+0

좋은 지적이지만, 우리가이 문제를 해결해야하는 것은 문제가되지 않는 것 같습니다. andoid 스레드가 읽기를 등록하지 않을 때마다 쓰기를 기록합니다. –

+2

'java.util.concurrent'에서 콜렉션 중 하나를 사용하십시오. 만약 당신이'LinkedBlockingQueue'와 같은'BlockingQueue'를 사용한다면 당신은 당신이 사용하고있는 것으로 보이는 끔찍한 busy-wait 반 패턴을 제거 할 수 있습니다. –

답변

0

우리의 코드에는 많은 문제점이있었습니다. 안드로이드 응용 프로그램이 두 번 연결 되었기 때문에 버퍼에 쓰는 두 개의 스레드가 있음이 밝혀졌습니다. 오직 하나만 올바른 소켓에 쓰고있었습니다. 대기열에 동기화가 없으면 어떤 스레드가 이벤트를 예측할 수 없게 만들었으므로 ja_mesa가 디버그 로그에 번호를 매길 때까지 알기가 어려웠습니다.

inputthread가 종료 된 후에 출력기 스레드를 종료해야한다는 것이 판명났습니다.