-
파이썬 소켓 프로그래밍 사용법Python study/실전프로젝트 2021. 7. 19. 14:25
소캣이란
네트워크 프로그래밍 분애에서 소켓은 연결된 네트워크의 양 끝단을 추상화 시킨 개념이다.
컴퓨터의 관점에서는 네트워크로 통하는 컴퓨터의 외부와 컴퓨터 내부의 프로그램을 이어주는 인터페이스 이다.
네트워크를 통해서 바이트스트림을 주고 받을 수 있는 창구라 보면된다.
다만 , 단순히 프로그램의 내부와 외부를 잇는 표준 입출력과는 달리 소켓은 네트워크의 반대편이 어디인지에 대한 정보를 가지고 있다. 즉 우리가 택배를 보낼 때 박스에 물건을 넣고 받는 사람 주소를 쓰는 것 과 비슷하게 소켓은 어디로 보내지는 창구라는 것이 명시된 택배 상자 같은 것이다.
파이썬의 소캣
파이선의 socket 모듈은 소켓 프로그래밍에 필요한 시스템 콜을 래핑하는 API를 제공하는 모듈이다.
소켓 통신을위해서 물론 소켓을 생성해서 사용ㅎ는데, 서버와 클라이언트일 때가 조금 다르다.
소켓 생성하기
socket.socket() 함수를 이용해서 소켓 객체를 생성할 수 있다. 서버든 클라이언트든 동일하게 소켓을 이용한 네트워킹을 하기 위해서는 소켓을 먼저 생성 할 필요가 있다. 이 함수는 두가지 인자를 받는데 하나는 패밀리이고 다른 하나는 타입이다.
1. 패밀리
첫번째 인자는 패밀리이다. 소켓의 패밀리란, "택배상자에 쓰는 주소 체계가 어떻게 되어 있느냐"에 관한 것으로 흔히
AF_INET 이나 AF_INET6를 많이 쓴다. 전자는IP4v 에 후자는 IP6v 에 사용된다. 각각 socket.AF_INET , socket.AF_INET6로 정의 되어 있다.
2. 타입
소켓의 타입이다. raw 소켓 , 스트림소켓 , 데이터그램 소켓 등이 있는데, 보통 많이 쓰는것 은
socket.SOCK_STREAM 혹은soket.SOCK_DGRAM 이다.
가장 흔히 쓰이는 soket.AF_INET , socket.SOCK_STREAM 조합은 사실 socket.socket() 인자중에서 family= , type= 에 대한 기본 인자값이다. 따라서 이 타입의 소켓을 생성하고자 하는 경우에는 많은 파이썬 소켓 관련 튜토리얼과 달리, 인자를 생략하고 socket.socket() 만 써도 무방하다
이렇게 생성한 소켓을 통해 데이터를 주고 받기 위해서는 소켓을 포트에 맵핑하고 상대측 포트에 연결하는 과정이 필요하다.
이 과정은 서버측과 클라이언트 측의 구성 방식이 약간 다르다
TCP 에 대한 소켓 API 호출 순서 및 데이터 플로우 1. 서버에서는 socket(),bind(),listen(),accept()순으로 함수들을 호출하여 리스닝 소켓을 생성합니다.
리스닝 소켓은 클라이언트의 접속을 대기하는 역활을 합니다.
2. 클라이언트가 연결되면 accept()에서 새로운 소켓을 리턴하여 클라이언트와 통신시 사용하도록 합니다.
3. 클라이언트는 connect 함수를 호출하여 서버에 연결을 시도합니다. 이때부터 3-way 핸드세이크를 시작합니다.
핸드 세이크는 네트워크를 통해 양쪽이 연결되는 것을 보장하므로 중요합니다. 클라이언트가 서버에 도달할 수 있으며 그 반대도 마찬가지입니다.
4. 연결이 완료된 후 , 서버와 클라이언트는 send 함수와 recv 함수를 호출하여 데이터를 주고 받습니다.
5. 클라이언트가 연결 종료 메시지를 전송하거나 소켓을 닫으면 서버는 클라이언트와 통신을 위해 사용한 소켓을 닫습니다.
'Python study > 실전프로젝트' 카테고리의 다른 글
python_android device 제어 : 다수의 device_serial number 문자열 처리 (0) 2022.10.11 for문 구조에 대한 고민 (0) 2021.08.23 openpyxl - 엑셀을 다루기 위한 패키지. (0) 2021.08.20 파이썬 GUI 프로그래밍 - PYQT5 (0) 2021.07.20 파이썬 GUI 프로그래밍 (0) 2021.07.20