본문 바로가기

프로그래밍 이야기

소켓 통신에서 InputStream / OutputStream을 열 때 무한대기(멈추는 현상)은 왜 일어날까요?

자바에서 소켓 통신을 할 때 메시지 수신 측에서는 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을 열 수 있습니다. 

이를 그림으로 표현하면 다음과 같이 표현할 수 있습니다.