소켓 프로그래밍 입문 #1

CJB_ny·2022년 2월 17일
0

Unity_Server

목록 보기
22/55
post-thumbnail

이렇게해서 네트워크 쪽을 알아보았는데

사실은 네트워크 쪽은 많이 알면 알 수록 도움이 많이 된다.

일반적으로 네트워크 공학은 학교에서 한학기 동안 배우는 내용이다.

그래서 굉장히 학습할 내용이 많다.

그래서 그 내용에 대해서 하나하나씩 다 얘기를 하면 몇십시간의 강의가 될 테니까

1. 소켓 프로그래밍

소켓 프로그래밍에 대해서 배우면서 실제로 코딩을 하는 시간을 가져보도록 하겠다.

처음에 막바로 보면은 멘붕이 올 수 있기때문에

흐름이 처음에 보기에는 복잡하기 때문이다.

그래서 이 흐름에 대해서 이해를 하기 위해서 PPT를 보도록 하자.

그래서 고급식당으로 돌아와보면은

이번 주제는 직원을 관리하고 그런게 아니라

왼쪽에 손님이 대기를 하고있는데

손님이 입장을 하는 == 통신하는 과정을 나타내고 있는 것이다.

그렇다면

{ 손님의 입장 != 식당의 입장 } 일 것이다.

일단

식당의 입장

부터 알아보자면 인테리어도 끝내고 이제 영업을 개시를 하기 위해서는 뭐부터 해야할지 생각을 해보도록 하자.

그래서 지금보면은 신기하게도 "입구"가 없다는 것을 알 수 있다.

그래서 이렇게 문을 만들고 문지기를 고용을 해야한다.

그리고 나서는 이제

이런식으로 문지기를 교육을 시켜야 할 것이다.

일단은, 식당에 대한 전화번호나 주소를 알아야지만

응대를 할 수 있을 것이다.

지금 같은 경우 루키스 중화요리 서초점이라고 교육을 시킨것이고

경우에 따라서는 입구도 여러개 있을 수 있다.

니는 지금 정문에 있다는것 까지 교육을 시켜주었다.

그리고 대기를 하다가 손님한테도 연락이 올 수 있으니까 이런식으로 핸드폰도 하나 쥐어주게 하였다.

그러면 이제 준비가 다 된거 같으니까

이렇게 영업을 시작하면 될 것이다.

그러면 이제

문지기는

  • 손님의 연락을 받을 준비 ok

  • 손님이 오면 입장 안내도 ok

그리고 이제 이렇게 손님이 왔는데

(손님이 어떻게 왔는지는 나중에 손님 입장에서 알아 볼 것이다)

여차여차 해서 이렇게 문지기한테 연락이 왔다고 가정을 해보도록 하자.

그래서 문지기는 식당 상황을 보고 대기열이 없고 괜찮은거 같으면

이렇게 입장을 시켜 줄 것이다.

근데, 일반적인 식당의 경우 모든 일행들을 다 입장을 시켜 줄테지만

지금은, 손님한테 특별한 요구사항이 있어가지고

그냥 한명만 대리인의 자격으로 한명만 테이블에 앉혔다고 가정을 하자.

그래서 어쨋든 식당입장에서는 자리가 났으니까

앉혀 줄것이고

이런식으로 대리인 에게 핸드폰 하나를 쥐어주게 될 것이다.

이 핸드폰의 목적은 (식당에서 제공을 해준 것인데)

처음에 문의를 줬던 손님과 연락을 할 수 있게 하는 핸드폰이라고 가정을 하자.

그래서 이 대리인은 핸드폰을 통해서 자신의 일행과 연락을 할 수 있게 되었다.

그리고 당연히 원래 처음에 문의를 했던 손님도

이렇게하면 대리인과 연락을 할 수 있게 되었다.

손님의 입장 (관점)

그렇다면 손님은 어디서 와가지고 저 멀리 보이는 식당에다가 연락을 하기 위해서

이렇게 자신의 폰을 준비를 해와서

루키스 중화요리 서초점에다가 연락을 할 것이다.

그래서 입장이 가능한지의 여부를 물을 것이고,

그러면 이제 문지기가 입장이 가능하다는 사인을 내려 줄 것인데

그럼 아까와 마찬가지고 대리인이 입장을 할 것이다.

그리고 일반적으로 핸드폰을 전화를 걸 때를 생각을 해보면은

굳이 본인의 전화번호는 알릴필요 없이

전화건 사람의 연락처가 보이는데

마찬가지로 굳이 자신으 전화번호는 알려주지 않는다고 하더라도

이 문지기는 연락을 받음과 동시에

누가 자신한테(문지기) 연락을 했는지 알 수 있기 때문에

이제 대리인의 휴대폰에다가는 처음 연락한 손님의 주소 (전화번호를) 넣어 줄 수 있게 되는 것이다.

그래서

사실은 아까 이런식으로 연락을 할 수 있었던 이유는

문지기가 셋팅을 해줘가지고 연락이 가능하다고 보면 된다.

그래서 최종적으로 보면은

이 문지기의 역할은

"입구"에서 입구컷을 할지 말지의 결정이였다.

그래서 별 문제가 없으면 손님을 입장시켜서 대리인을 앉혀주고

손님과 손님의 대리인이 연락을 할 수 있게금 길을 뚫어 준것이다.

2. 요약

손님은 사실 별로 한게 없다.

그냥

1) 핸드폰 준비

2) 식당으로 연락 -> 입장가능한지 물어봄

이정도 일 것이다.

다음 부분은

다 식당과 식당의 문지기가 다 한 것이고

그래서 모든게 잘 풀렷다고 하면은

식당에 손님의 대리인이 들어가게해서 연락이 되게하고 식당과의 이슈가 생기면 대리인을 통해서 뭐 해결을 할 것이다.

그리고 반대로

식당의 입장에서 보면은 조금더 복잡하다.

식당은

1) 문지기 고용

2) 문지기 교육 (식당번호 알려줌)

3) 영업 시작 (손님한테 연락이 온다면 이제 > 4) 로 감)

4) 안내

그래서 이 4단계를 다 거치게 되면

최종적으로 손님의 대리인을 식당에 입장시키게 됨.

3. 소켓 프로그래밍과의 비교

이전에 계속 나왔던 "핸드폰"이라는 것이 이제 "소켓" 이라는 용어로

변하게 될 것이다.

소켓

소켓 == 네트워크 통신을 하기 위한 "장치" 라고생각하셈.

(추상적인 장치 라고 생각하셈)

그래서 어디에다가 연락을 주고 받을 때는 반드시 이 소켓을 통해서 주고받게 될 것이다.

그리고 손님이 식당 전화번호로 전화를 해가지고 입장이 가능한지 물아본것

"소켓"을 통해가지고, 서버 주소로 connect하게 되는것을 의미한다.

이렇게까지만 해주면

나머지 부분은 "서버"가 처리를 하게 되는 것이다.


클라의 관점

그리고 손님은 클라 && 서버 구조에서 "클라"부분을 맡게 되는 것이고

그리고 아까 "대리인"은 이제 == "세션" 이라는 용어로 바뀌게 될 것이다.

그래서 결국,

클라이언트가 서버에 접속을 하면은

서버 (식당)에서 이런저런 처리를 해준다음에

"세션"을 하나 만들어 줄 것인데,

그 다음 모든 통신 (손님과 대리인의 연락)들은 이 "세션" (대리인)을 통해서 이루어 지게 된다는 것이다!

서버의 관점

1) 문지기 고용 == Listener 소켓을 준비

  • (일반적인 연락을 주고 받는 소켓 (핸드폰이 아니라) 그냥 문지기 역할을 하는 소켓임

2) 문지기 교육 (식당 전화번호 알려줌) == Bind (서버 주소 / Port를 소켓에 연동)

  • 식당 주소와 번호를 알려주는 교육시킴 -> 이것을 Bind라는 함수를 통해서 할 것임
  • 그래서 우리가 아까 준비한 Listener소켓에다가 서버주소 / Port 같은 것을 연결을 시켜 줄 것이고, Bind끝나면 이제 영업시작 단계 시작.

3) 영업 시작 == Listen (이라는 함수 사용)

  • 말 그대로 이제부터 Listen부터 듣기 시작한다! 라는 말 즉, 혹시라도 손님들에게 문의 전화고 오면 받을 수 있는 상태 유지
    만약 이상태에서 "클라"한테서 접속 요청이 온다고 하면은,

4) 안내 == Accept (때리기)

  • 만약 이상태 (영업 시작)에서 "클라"한테서 접속 요청(connect로 온다면)이 온다고 하면은, Accept를 때려가지고, 안내를 해주는 로직을 타게 될 것이다.

그래가지고

최종적으로 Accept까지 다 끝났다면은,

클라이언트 세션이 하나 만들어 질 것인데

그 세션에도 똑같이 소켓(연락을 주고받을 장치 == 폰)이 하나 있을 것이다.

그래서 나중에 이 손님과 대화를 하고싶으면

이 손님을 대표하는 즉, 클라이언트의 소켓이랑 메세지를 주고받으면

그게 알아서 손님한테 전달이 된다는 말이다.

이게 그래서 큰 흐름이고 코드로 보면 조금더 간단할 것이다.

오늘은 중요했던것은

흐름만 보면된다.

클라 관점에서는 쉬웠지만

서버 관점에서는 할게 많았다 라는것을 알면되고

핸드폰의 존재 == 소켓의 존재 도 중요!

그래서 이제 코드로 넘어가보도록 하자!

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글