스레드를 연습하기 위해 채팅 프로그램을 개발하기로 했다.
채팅 프로그램은 예제 코드가 많아서, 다른 코드를 참고하면서 소켓과 스레드에 대한 이해를 하는 것이 목적이다.
소켓?
-
참고자료
-
네트워크 소켓(network socket)은 컴퓨터 네트워크를 경유하는 프로세스 간 통신(IPC:Inter-Process Communication)의 종착점(endpoint)이다.
-
오늘날 컴퓨터 간 통신의 대부분은 인터넷 프로토콜을 기반으로 하고 있으므로, 대부분의 네트워크 소켓은 인터넷 소켓이다.
-
네트워크 통신을 위한 프로그램들은 소켓을 생성하고, 이 소켓을 통해서 서로 데이터를 교환한다.
RFC 147 정의를 보면
- 소켓은 32비트 숫자이며, 짝수 소켓은 수신, 홀수 소켓은 송신에 사용된다.
- 네트워크를 통한 통신은 소켓끼리 이루어지며, 각 소켓은 실행 중인 프로세스로 식별된다.
자세하게 설명되어 있지만 핵심은 양방향 통신이라는 점, HTTP와 달리 연결을 종료하기 전까지는 통신이 계속 연결되어 있다는 점이 채팅에서 소켓을 사용하는 이유이다.
채팅 프로그램 만들기
-
파이썬 기본 라이브러리로 제공되는 socket을 import해서 사용할 수 있고, 채팅을 사용할 클라이언트와 클라이언트의 메시지를 뿌려주는 서버가 필요하다.
-
서버에서는 여러 클라이언트를 핸들링하기 위해
클라이언트에서는 송신과 수신을 실시간으로 하기 위해 스레드를 사용한다.
서버
1. socket 생성
- TCP나 UDP로 생성할 수 있는데, 순서를 보장하기 위해 TCP로 생성한다.
TCP? UDP?
- 세계통신표준 모형인 OSI 모델 7계층 중 4계층인 전송 계층(Transport Layer)에서 사용하는 규약
- TCP(Transmission Control Protocol)
- 신뢰성: 메시지 수신 확인
- 순서 정렬: 메시지가 보내진 순서 보장
- UDP(User Datagram Protocol)
- 부하: 오버헤드가 적으며 일반적으로 TCP보다 빠르다
- 영상 스트리밍과 같이 시간에 민감한 전송에 사용
2. socket bind
- bind 함수 안의 host와 port는 tuple 형태
3. socket listen
4. 함수1: 클라이언트 메시지 수신 및 발신
5. 함수2: 클라이언트 메시지 발신
- sender_socket에 대한 조건절이 없으면 자신이 보낸 메시지는 2번 반복해서 보인다.
6. 반복문/스레드
- 프로그램 실행 중 계속
- 클라이언트가 있는 만큼 handle_client 호출
클라이언트
1. 소켓 생성 및 연결
- 서버와 같은 host, port여야 함
- connect 함수 안의 host와 port는 tuple 형태
2. 함수1: 메시지 발신
- 메시지 포맷팅도 이 함수 안에서 가능하다.
- 각 클라이언트의 메시지를 구분하기 위해 user_name을 input으로 받았다.
- 자신이 보낸 메시지는 수신하지 않기 때문에, 자신이 보낸 메시지는 user_name 없이 보인다.
3. 함수2: 메시지 수신
- recv 함수로 메시지 버퍼사이즈를 정해줌
- 최대 1024 바이트까지 읽을 수 있음
스레드 락을 사용하는 기능은 다음 기회에...