자바에서 소켓 통신을 할 때 메시지 수신 측에서는 InputStream을 열고,
송신측에서는 OutputStream을 열어 데이터를 통신의 통로로 사용합니다.
여기에서 InputStream이나 OutputStream을 열 때 주의해야 할 점이 있습니다.
바로 "양 측에서 각각 Stream을 열어야 한다"는 것입니다.
무슨 말인가 하면... 위에서 '수신측에서는 InputStream'을, 'OutputStream을' 연다고 언급했습니다.
데이터 수신측에서 InputStream을 열었다면 송신측에서는 OutputStream을 연다는 얘기죠.
즉 '상호간 Stream이 모두 열려야'합니다.
만약 Stream을 열 때, 한 쪽에서 하나의 스트림만(InputStream이나 OutputStream 중 하나만) 열게 되면 어떻게 될까요?
이미 소켓 통신을 사용해보신 대다수의 분들은 경험해 보셨을지 모르겠지만, InputStream이나 OutputStream을 여는 부분에서 더 이상 진행하지 못하고 무한 대기 상태에 빠지게 됩니다.
(getInputStream() 혹은 getOutputStream() 에서 더 이상 진행되지 못함)
Socket통신에서는 어느 한 쪽에서 InputStream을 열었다면
다른 한 쪽에서 그 소켓의 OutputSteam을 열어
'데이터를 주고받을 수 있는 통로'가 만들어질 때까지 기다리게 됩니다.
이러한 특성 때문에, 만약 상호간에 데이터를 주고받으려면(즉, InputStream과 OutputStream을 모두 사용해야 할 경우)
각 측에서 InputStream과 OutputStream을 교차로 열도록 구현해야 정상적으로 Stream을 열 수 있습니다.
이를 그림으로 표현하면 다음과 같이 표현할 수 있습니다.
'프로그래밍 이야기' 카테고리의 다른 글
Jersey에서 원소가 한개인 JSONArray를 반환할 때 Array로 반환되지 않는 문제 해결 (0) | 2012.09.04 |
---|---|
Google App Engine + Jersey를 사용하여 REST 서비스 구축하기 (3) | 2012.08.13 |
이클립스 CDT로 편리하게 GeekOS 프로젝트 진행하기 (0) | 2012.03.20 |
GeekOS 과제를 위한 환경설정 (7) | 2012.03.15 |
맥 OS X Lion에서 화면 확대/축소 사용하기 (0) | 2012.02.11 |