파이썬 브로드캐스트 채팅 프로그램 만들기

안녕하세요. 오늘은 같은 네트워크 내에서 사용할 수 있는 브로드캐스트 채팅 프로그램을 만들어보겠습니다. 브로드캐스트란 네트워킹에서 사용되는 통신 방식으로, 송신 호스트가 전송한 데이터가 네트워크에 연결된 모든 호스트에게 전송됩니다.

브로드캐스트

이 방식은 네트워크상의 모든 장치에 동시에 메시지를 전달할 때 사용됩니다. 예를 들어, 한 컴퓨터가 네트워크 내의 모든 컴퓨터에게 동시에 메시지를 보낼 때 브로드캐스트 방식이 활용될 수 있습니다. 이번 글에서는 파이썬을 사용하여 간단한 채팅 프로그램을 만드는 방법을 알려드리겠습니다.

개발 환경 설정

먼저, 파이썬 개발 환경을 설정해야 합니다. 파이썬 3 버전 이상이 필요합니다. 터미널이나 윈도우 스토어에서 파이썬을 설치하시고 터미널에서 pip install socket 명령어로 소켓 라이브러리를 설치합니다.

서버 구축

서버는 클라이언트의 연결을 받아들이고 메시지를 브로드캐스트하는 역할을 합니다. 여러 클라이언트가 서버에 연결되어 있을 때 한 클라이언트가 메시지를 보내면, 서버는 다른 모든 클라이언트에게 해당 메시지를 전송합니다.

import socket
import threading

# 모든 클라이언트들을 저장하는 리스트
clients = []

# 모든 클라이언트들에게 메시지를 전파
def broadcast(message):
    for client in clients:
        client.send(message)

# 클라이언트의 메시지를 처리
def handle(client):
    while True:
        try:
            # 클라이언트로부터 메시지를 받음
            message = client.recv(1024)
            # 받은 메시지를 모든 클라이언트들에게 전파
            broadcast(message)
        except:
            # 클라이언트와의 연결이 끊어지면 해당 클라이언트를 리스트에서 제거하고 연결을 닫음
            index = clients.index(client)
            clients.remove(client)
            client.close()
            break

# 클라이언트의 연결을 받아들이고 처리하는 함수
def receive():
    while True:
        # 클라이언트의 연결을 받아들임
        client, address = server.accept()
        print(f"Connected with {str(address)}")
        # 연결된 클라이언트를 리스트에 추가
        clients.append(client)
        # 클라이언트에게 환영 메시지를 보냄
        client.send('Welcome to the chat!'.encode('utf-8'))
        # 클라이언트의 메시지를 처리하는 스레드 생성 및 시작
        thread = threading.Thread(target=handle, args=(client,))
        thread.start()

# 서버 소켓 생성
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 서버 주소와 포트 설정
server.bind(('localhost', 55555))
# 클라이언트의 연결을 기다림
server.listen()

# 클라이언트 연결을 처리 함수 호출
receive()

클라이언트 구현

클라이언트는 서버에 연결하고 메시지를 보내며 다른 사용자의 메시지를 받습니다. 클라이언트 소켓을 사용하여 서버에 연결하고 레드를 사용하여 메시지를 수신 및 송신하는 간단한 채팅 클라이언트를 구현합니다.

import socket
import threading

# 서버로부터 메시지를 수신하는 함수
def receive_message(client):
    while True:
        try:
            # 클라이언트 소켓을 통해 서버로부터 메시지를 받음
            message = client.recv(1024).decode('utf-8')
            # 받은 메시지를 화면에 출력
            print(message)
        except:
            # 예외 발생 시 클라이언트 소켓을 닫고 반복문을 빠져나감
            print("An error occurred!")
            client.close()
            break

# 사용자로부터 메시지를 입력받아 서버로 전송하는 함수
def write_message(client):
    while True:
        # 사용자로부터 입력을 받아 메시지를 생성
        message = f'{nickname}: {input("")}'
        # 메시지를 UTF-8 형식으로 인코딩하여 서버로 전송
        client.send(message.encode('utf-8'))

# 서버의 주소와 포트 번호 설정
server_address = ('localhost', 55555)
# 클라이언트 소켓 생성
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 서버에 연결
client.connect(server_address)

# 사용자로부터 닉네임 입력 받음
nickname = input("Choose your nickname: ")

# 메시지 수신을 담당할 스레드 생성 및 실행
receive_thread = threading.Thread(target=receive_message, args=(client,))
receive_thread.start()

# 메시지 송신을 담당할 스레드 생성 및 실행
write_thread = threading.Thread(target=write_message, args=(client,))
write_thread.start()

브로드캐스트 채팅 프로그램 원리

이 코드는 간단한 채팅 애플리케이션을 구현하기 위해 소켓 프로그래밍과 멀티스레딩을 사용합니다. 여기서 클라이언트는 사용자와의 상호작용을 담당하고, 서버는 모든 클라이언트 간의 통신을 중계하는 역할을 합니다.

클라이언트 동작 원리

  1. 클라이언트는 사용자로부터 닉네임을 입력받음
  2. 서버에 연결을 시도
  3. 두 개의 스레드를 시작

하나는 서버로부터 메시지를 수신하고 출력하는 스레드이고, 다른 하나는 사용자로부터 입력을 받아 서버에 메시지를 전송하는 스레드입니다.

사용자가 메시지를 입력하면, 해당 메시지는 닉네임과 함께 서버에 전송되는 것이고, 서버로부터 메시지가 수신되면 메시지가 화면에 출력됩니다.

    서버 동작 원리:

    1. 서버는 지정된 포트에서 클라이언트의 연결을 받아들이기 위해 대기
    2. 클라이언트가 연결되면, 새로운 클라이언트를 처리하기 위한 스레드를 생성
    3. 각 클라이언트와의 통신을 담당하는 스레드는 클라이언트로부터 메시지를 수신하고, 수신된 메시지를 모든 클라이언트에게 브로드캐스팅
    4. 클라이언트가 연결을 종료하면 해당 클라이언트는 서버에서 제거

    결론

    위 프로그램은 소켓 프로그래밍을 사용하여 클라이언트와 서버 간의 통신을 구현하고, 멀티스레딩을 사용하여 여러 클라이언트의 동시 접속을 처리합니다. 이를 통해 여러 사용자가 동시에 채팅을 할 수 있는 간단한 채팅 애플리케이션을 만들 수 있습니다. 이러한 기본적인 원리를 이해하면 이후 더 복잡한 채팅 시스템을 구현하는 데 확장할 수 있습니다.

    이상으로 파이썬 브로드캐스트 채팅 프로그램을 만드는 방법과 원리를 알아보았습니다. 또 다른 다양한 IT 개발 정보를 알고싶으시면 블로그 메인도 방문해주세요. 감사합니다.