간단한 채팅 프로그램

yun·2023년 9월 17일
0

Python

목록 보기
6/13

스레드를 연습하기 위해 채팅 프로그램을 개발하기로 했다.
채팅 프로그램은 예제 코드가 많아서, 다른 코드를 참고하면서 소켓과 스레드에 대한 이해를 하는 것이 목적이다.

소켓?

  • 참고자료

  • 네트워크 소켓(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: 클라이언트 메시지 수신 및 발신

  • 이 함수 안에서 함수2를 호출해서 사용

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 바이트까지 읽을 수 있음

스레드 락을 사용하는 기능은 다음 기회에...

0개의 댓글