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' 카테고리의 다른 글
[Java] 생성자에서는 getInstance호출에 신중하자. (0) | 2022.11.30 |
---|---|
[Java] Java에서 Redis 를 사용해보자. Jedis 사용하기 (0) | 2022.11.23 |
[Java] Method Reference 사용법 (0) | 2022.10.28 |
[Java] JIT 컴파일러란? (Just in time compiler) (0) | 2022.10.28 |
[Java] 좋은 영상 (0) | 2022.10.24 |