Java

[Java] PrintWriter 의 AutoFlush 사용

Razelo 2022. 11. 23. 12:16

TCP 상에서 Client와 Server 상에서 문자열을 주고받는 것을 확인하려고 하는 와중에 문제가 발생했다. 

 

아무리 client에서 입력을 하고 readLine으로 읽어들인 문자열을 server 쪽으로 보내려고 해도 server 상에서 받았다는 표시가 뜨지 않았다.

 

즉 아예 받지 못한 문제가 발생했다. 컴파일이나 런타임 에러도 아니고 그저 의도된 작동이 재현되지 않는 것이 문제였다. 

 

문제의 원인은 금방 찾을 수 있었다. 

 

원인은 PrintWriter에서 AuthFlush 를 사용하지 않았기 때문이다. 

 

이제 문제가 발생한 배경에 대해서 알아보도록 하겠다. 

 

우리는 통상 TCP 소켓 프로그래밍을 할때 server 쪽으로 전송하기 위해 client에 다음과 같은 코드를 작성하게 된다. 

 

in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())));

 

그런데 이렇게만 설정하게 되면 내가 어떤 string을 input으로 주더라도 buffer가 차기 전까지는 server 측에 전달되지 않는다.

 

왜냐면 AuthFlush를 설정해주지 않았기 때문이다.

 

AuthFlush가 true이면 output buffer 가 얼마나 찼는지와는 관계없이 println이 불릴때마다 혹은 \n 등이 쓰일때마다 Flush 가 된다고 보면 된다. 

 

그러니 위 예시 코드를 아래와 같이 수정하자. 

 

in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);

 

위와 같이 수정하면 이제는 client 측에서 입력하고 엔터를 누를때마다 해당 input 이 server 쪽으로 전송되는 것을 확인할 수 있을 것이다. 

 

아래처럼 잘 전송되는 것을 확인할 수 있다. 왼쪽이 server이고 오른쪽이 input을 입력받는 client이다. 

 


아래 블로그에 나와 정확히 동일한 문제를 겪으신 분이 계신다.

 

도움이 되었습니다. 

 

감사합니다. 

 

https://live-everyday.tistory.com/105

 

Java PrintWriter의 println 메소드가 생각대로 작동하지 않는다

TCP 방식으로 데이터를 주고받게 하기 위해 아래와 같이 Server 클래스와 Client 클래스를 만들었다. Server class ServerSocekt Socket BufferedReader PrintWriter Client class Socket BufferedReader PrintWriter 한 쪽에서 다른

live-everyday.tistory.com

 

반응형