2010-05-23 3 views
0

처음부터 FTP 클라이언트를 구축 중이며 response codes이 즉각적이지 않은 것으로 나타났습니다 (놀랄 일도 아닙니다). 명령에 해당 코드를 가져 오는 좋은 접근 방법은 무엇입니까?비동기 응답 처리

다음은 Filezilla 서버의 출력 예입니다. 응답 코드는 각 행 끝의 세 자리입니다.

(000057) 23/05/2010 19:43:10 - (not logged in) (127.0.0.1)> Connected, sending welcome message... 
(000057) 23/05/2010 19:43:10 - (not logged in) (127.0.0.1)> 220-FileZilla Server version 0.9.12 beta 
(000057) 23/05/2010 19:43:10 - (not logged in) (127.0.0.1)> 220-written by Tim Kosse ([email protected]) 
(000057) 23/05/2010 19:43:10 - (not logged in) (127.0.0.1)> 220 Please visit http://sourceforge.net/projects/filezilla/ 
(000057) 23/05/2010 19:43:10 - (not logged in) (127.0.0.1)> user anonymous 
(000057) 23/05/2010 19:43:10 - (not logged in) (127.0.0.1)> 331 Password required for anonymous 

답변

1

이 특별한 경우에는이 기능을 비동기 적으로 구현하지 않을 것입니다. 명령을 보내고 응답 코드를받는 사이의 지연이 크지 않은 한 (아마도 FTP가 아님), 마지막 명령의 결과를 알지 못하는 다른 명령을 안전하게 실행할 수 있습니다 (아마도 불가능할 것입니다). 이것을 비동기 적으로 구현하려고 할 가치가 있습니다.

난 당신이 같은 실행 방법있을 수 있습니다 명령 문자열을 전송하고 의사에 즉, 다시 전체 응답을 수신 사이의 실행을 차단하는 것 :

  1. 것은 대한 네트워크
  2. 대기를 통해 명령 문자열을 보내기 차단 네트워크 읽기 방법을 사용하거나 non-blocking 메소드 + Thread.sleep (..)을 사용하여 되돌아 오거나 (시간 초과를 원할 경우) + 문자.
  3. 문자가 ' 응답 '토큰 (줄 바꿈?)
  4. 그렇지 않으면 2로 돌아갑니다. if 응답 문자열 전체를 반환하십시오.

실제로 비동기 경로를 사용하기로 결정한 경우 Callback pattern을 살펴보아야합니다.

희망이 도움이됩니다.

+0

해 냈습니다. 나는 또한 아파치의 Commons Net을 통해 발굴 조사를했다. 그들이 사용한 것은 EventObject와 EventListener의 조합입니다. 응답을 위해, 코드가 있고 결과 라인이 ArrayList에 추가되는 한 ReadStream()이 InputStreamReader에서 호출됩니다. 이와 같은 비동기 처리가없는 것 같고 시간 초과는 아마도 java.net 클래스에 의해 처리됩니다. –