#목적
1. Socket Stream을 사용하면서 배운 내용을 정리한다.
#내용
1. Socket사용 예시
a. Socket 연결
b. Socket Output Stream 생성
c. 정보 전달
d. Socket Input Stream 생성
e. 정보 받음
2. 1.c에서 정보를 전달하였으니 OutputStream을 필요 없다고 판단
3. OutputStream Close 후 InputStream생성 후 사용
a. OutputStream.close()
4. 이때 Socket이 닫혀서 사용이 불가하다는 오류 발생
5. 나는 Stream을 닫았는데 왜 Socket이 닫혔다는 거지?
6. Stream을 닫으면 해당 Socket도 닫힌다고 한다. 이에 Stream만 닫고 싶다면 shutdown을 사용해야한다.
a. https://stackoverflow.com/questions/3956163/does-closing-the-inputstream-of-a-socket-also-close-the-socket-connection
b. socket.shutdownOutput()
6. 이번에는 Socket 오류는 발생하지 않지만 정보를 받기 위해 사용한 InputStream이 정보를 받지 못하고 있다.
7. 아래 블로그를 참고하면 Stream이 닫혀서 생기는 문제라면 EOF(-1)을 반환한다고 한다.
a. http://cbts.tistory.com/86
8. 하지만 나는 OutpusStream을 닫고 InputStream을 사용하려 한다.
9. 아래 링크를 참고하면 내가 OutputStream을 닫으면 InputStream은 실제로는 닫히지 않았지만 닫힌 것 처럼 동작한다고 한다.
결국 통신하는 Server에서는 EOF(-1)을 반환한다. 이에 모든 통신을 끝낸 뒤에 닫도록 하여야한다.
a. https://stackoverflow.com/questions/15206605/purpose-of-socket-shutdownoutput/15207447
#배운점
1. 해당 글을 작성할 때에는 사용 후 바로 닫아줘야 한다고 생각했다.
하지만 너무나 잘못된 생각이었고 모든 통신이 끝난 뒤에 연결을 닫아주는게 당연하다.
통신 한번에 열고 닫음을 반복하면 리소스 부담은 너무나도 커진다.
'개발 > Java' 카테고리의 다른 글
[java] DataInputStream.read(byte[] b)와 ByteArrayOutputStream.write(byte[] b)의 b (0) | 2021.07.01 |
---|---|
[java] JSON null check (0) | 2021.06.13 |
[java] switch-case 문자열 조건 (0) | 2021.04.19 |
[java] Generic을 사용해 Class 및 Method 동적 생성 및 호출 (0) | 2021.04.18 |
[java] Annotation 인식 (0) | 2020.11.11 |