Vanila Java 를 사용한 WAS 서버 구축 프로젝트를 하면서, 소켓 통신에 대해 배우게 되었다.
이 프로젝트를 하면서, Day 가 질문한 점이 있어 정리해보았다
Day : 서버 포트는 8080으로 열었는데 왜 Port가 자꾸 이상하게 뜰까요?!
- 첫번째 실행
New Client Connect! Connected IP : /0:0:0:0:0:0:0:1, Port : 53877
New Client Connect! Connected IP : /0:0:0:0:0:0:0:1, Port : 53878
...- 두번째 실행
New Client Connect! Connected IP : /0:0:0:0:0:0:0:1, Port : 53893
New Client Connect! Connected IP : /0:0:0:0:0:0:0:1, Port : 53894
...
Client가 접속한 포트는 8080이어야 하는데 왜 53877 ... 와 같은 포트번호가 뜨는 건가요?부끄럽지만.. 데이의 학습을 위해 정리해본 자료를 적어본다..
https://profuse-aftershave-ac6.notion.site/Client-Port-8080-e2e1f2e3e1f240e4b159cacd975b3feb?pvs=4
private static final int DEFAULT_PORT = 8080;
...
port = DEFAULT_PORT; // PORT 번호를 8080으로 설정!
...
ServerSocket listenSocket = new ServerSocket(port); // Socket을 생성!

[ 대화 Protocol(약속) ]
1) 질문자가 인사를 한다.
2) 인사를 해야 한다.
라고 Protocol(약속)을 정의해볼게요!
[ ⭕️ 대화 약속이 지켜진 경우 ]
나 : 데이~ 굿모닝입니다!
데이 : 네~ 굿모닝이에요~
[ ❌ 대화 약속이 지켜지지 않은 경우 ]
나 : 데이 ~ 굿모닝입니다!
데이 : ... [아무 응답도 하지 않음]
나 : ... [왜 데이가 대답을 안하지... 계속 기다림..]

왼쪽 : Client / 오른쪽 : Server
아래처럼 약속을 정리할 수 있을 것 같아요!
[ HTTP 통신 약속]
1) Client(쭌마이)가 Server(데이)로 Request(인사)를 보낸다.
2) Server(데이)가 Client(쭌마이)에게 Response(인사)를 보낸다.
→ 그러면 Server가 Request를 보내고 싶을 때는요..??
Server(데이) : 나도 준마이(Client)한테 인사하고싶어...
> http protocol은 Server -> Client 통신을 지원하지 않아요!

소켓 통신이 나오면서, handshake 방식.. 등등이 나오지만 일단 넘어가요!
이제는 서버와 클라이언트의 “양방향” 통신이 가능하게 되었어요!
그림이 조금 어렵죠? 이해 안된다면 내리셔도 돼요! 위의 키워드만 기억하세요
소켓 통신을 통해 "양방향 통신" 이 가능하게 되었다!
로 정리할 수 있겠네요
사실 위의 내용도 설명하면 엄청 길지만 대충(?) 요약한 것이랍니다.. ㅠㅠ
그러면 이번 WAS 프로젝트에서는 어떻게 동작할까요?

ServerSocket을 생성 (Port 번호는 8080)
localhost:8080/ 에 접속할 때 마다 Client 소켓이 하나씩 생김!!
위의 경우에는 크게 4개의 소켓이 생길 수 있겠네요
🥹 : 서버 포트번호는 8080인거 알겠어.. 그러면 client 소켓 번호는 왜 무작위로 생성되는건데??ㅠㅠ
📣 배달의 민족 주문!!
주문 1 : 102동으로 피자 한 판 가져다주세요
📣 배달의 민족 주문!!
주문 2 : 102동으로 파스타 하나 가져다주세요
...
가게 : 102동 "몇 호"로 가져다 달라는 거지??
"몇 호"인지를 알아야 주문을 받지!!!!
📣 배달의 민족 주문!!
주문 1 : 102동 402호로 피자 한 판 가져다주세요
📣 배달의 민족 주문!!
주문 2 : 102동 902호로 파스타 하나 가져다주세요
...
가게 : 102동 402호로 피자!
가게 : 102동 902호로 파스타!
이제 주문이 명확해졌어요!
라고 정리할 수 있을까요? ㅎㅎㅎ
✅ 소켓 통신
✅ 포트 번호
위 2가지에 대해 우린 이미 알고있어요! 그러면 이제 마지막! 왜 client 포트 번호는 8080이 아닌거지?
→ 에 대한 답을 보러 가봅시다!!

→ 우리가 원하는 답은 Private Ports에 있습니다!!! 하지만, 다른 것들도 보고 가면 좋겠죠?
밑의 설명들을 보게 된다면,
왜 "클라이언트 포트 번호"는 1도 아니고 10도 아니고 100도 아니고 1000도 아니고
6xxxx, 5xxxx 단위인거야?? (6만 얼마, 5만 얼마)
에 대한 답을 할 수 있을 것입니다~!~!!

우리가 자주 쓰는 문자열을
private final static String HELLO = "hello";
라고 쓰는 것처럼 통신에도 자주 쓰이는 친구들이 있겠죠??
그 친구들을 0번부터 1023번까지 할당해줌으로서
우리는 영국, 미국, 한국, 일본.. 등등 누구이든지간에 상관없이
- 파일을 다운로드 받을때는 20번 포트! [ FTP ]
- 웹 페이지를 전송할때는 80번 포트! [ HTTP ]
...
이렇게 쓸 수 있는거에요!
하나의 약속인거죠 ㅎㅎ

→ 어! 우리가 사용했던 8080 포트도 보이네요!
들이 있었어요!!
그러면 49152부터 65535까지는 private ports가 되겠네요
저희가 노트북을 켜면 소켓 통신만 할까요?
- 크롬으로 lucas도 접속한다
- intellij로 코딩도 한다
- 유튜브 뮤직으로 음악도 듣는다
- slack으로 채팅도 한다
...
엄청나게 많은 것들이 이루어지고 있어요!
이러한 프로세스들을 우리는 49152번 부터 65535까지의 포트 번호들로 구분지어서 관리하고 있어요!
그러다 보니까 49152 ~ 65535 사이의 값들이 랜덤하게 지정이 되는 거에요
* 첫번째 실행
New Client Connect! Connected IP : /0:0:0:0:0:0:0:1, Port : 53877
New Client Connect! Connected IP : /0:0:0:0:0:0:0:1, Port : 53878
...
* 두번째 실행
New Client Connect! Connected IP : /0:0:0:0:0:0:0:1, Port : 53893
New Client Connect! Connected IP : /0:0:0:0:0:0:0:1, Port : 53894
...
실행을 할 때 마다, 우리는 private ports들 중에서 할당되지 않은 번호를 찾아요!
그래서 할당되지 않은 포트 번호들을 client socket의 port 번호로 붙여주는 것이랍니다~~
.. 미약한 설명.. 끝…