개발 공부

자바 소켓 통신 동기처리, blocking 본문

자바, 스프링, 웹개발/웹개발

자바 소켓 통신 동기처리, blocking

아이셩짱셩 2021. 6. 30. 15:28

소켓 통신 과정 중 데이터를 주고 받을 때

InputStream.read() 와

OutputStream.write() 로 데이터를 주고 받음을 이해했다.

 

이를 구현한 JAVA 소스를 보던 중 한가지 의문점이 들었다.

 

A - B 간의 socket 통신에서

1. A가 B 와의 Socket 통신을 요청

2. B가 accept

3. A가 B에게 OutputStream.write() 로 데이터 요청 정보를 송신

4. B가 InputStream.read() 로 데이터 요청 정보 수신

5. B가 필요한 비즈니스 로직 수행

5. B가 A에게 OutputStream.write() 로 데이터를 송신

6. A가 InputStream.read() 로 요청한 데이터를 수신

 

위와 같은 flow에서 서버 A가

OutputStream.write()와 flush()를 통해 데이터를 보낸 후 별다른 block이나 synchronizing 작업 없이 바로 InputStream.read()를 수행하는 것을 보고 B가 아직 데이터를 처리하지 않았는데도 read()가 끝나버려 데이터를 제대로 수신받지 못하는 현상이 일어나지는 않는지 의문이 들었다.

 

분명 어디선가 동기식으로 처리되기 때문에 문제가 없을 것이라고 생각하여 알아보았다.

 

단순히 순차적으로 생각하다보니 먼저 OutputStream.write()가 모든 내용을 다 쓴 후 response가 끝날 때까지 기다리지 않을까 하고 write()를 까보았지만 동기처리는 없었다.

그래서 알아보던 중 InputStream.read()에서 blocking을 수행하는 것을 확인했다.

... This method blocks until input data is available, end of file is detected, or an exception is thrown ....

https://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html#read%28byte%5B%5D%29

 

요청 서버 A는 요청정보에 대한 write(), flush()까지 끝내고 read()에서 데이터가 넘어오기를 기다리는 것이었다.

 

Comments