[파이썬] socket 채팅 애플리케이션 만들기

이번 포스트에서는 Python과 Socket 모듈을 사용하여 간단한 채팅 애플리케이션을 만들어보겠습니다. 소켓(Socket)은 네트워크 통신에 사용되는 API로서, 클라이언트와 서버 간에 데이터를 주고받는 데 사용됩니다.

필요한 라이브러리

우리는 Python에서 기본으로 제공되는 socket 모듈을 사용할 것입니다. 따라서 별도의 설치가 필요하지 않습니다.

서버 구현하기

import socket
import threading

# 서버 설정
HOST = 'localhost'
PORT = 5000

# 클라이언트 목록을 저장할 리스트
clients = []

def handle_client(client_socket, address):
    while True:
        # 클라이언트로부터 데이터 수신
        message = client_socket.recv(1024).decode('utf-8')
        
        # 더 이상 데이터를 수신하지 않으면 클라이언트 연결 종료
        if not message:
            remove_client(client_socket)
            break
        
        # 수신한 메시지를 모든 클라이언트에게 전송
        broadcast(message)
    
    client_socket.close()

def remove_client(client_socket):
    if client_socket in clients:
        clients.remove(client_socket)

def broadcast(message):
    for client in clients:
        client.send(message.encode('utf-8'))

def main():
    # 소켓 생성
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind((HOST, PORT))
    server_socket.listen(5)
    
    print(f"서버가 {HOST}:{PORT}에서 실행 중입니다.")
    
    while True:
        # 클라이언트의 연결 요청을 수락
        client_socket, address = server_socket.accept()
        
        # 연결된 클라이언트를 목록에 추가
        clients.append(client_socket)
        
        # 새 스레드를 생성하여 클라이언트의 요청을 처리
        thread = threading.Thread(target=handle_client, args=(client_socket, address))
        thread.start()

if __name__ == '__main__':
    main()

위의 코드는 간단한 채팅 서버를 구현하기 위한 코드입니다. 서버는 클라이언트의 연결을 수락하고, 클라이언트로부터 받은 메시지를 다른 클라이언트에게 전송합니다. 여러 클라이언트가 동시에 접속할 수 있도록 각 클라이언트에 대해 별도의 스레드를 생성하여 처리합니다.

클라이언트 구현하기

import socket
import threading

# 서버 설정
HOST = 'localhost'
PORT = 5000

def receive_message(client_socket):
    while True:
        try:
            # 서버로부터 데이터 수신
            message = client_socket.recv(1024).decode('utf-8')
            print(message)
        except:
            # 예외 발생시 연결 종료
            client_socket.close()
            break

def send_message(client_socket):
    while True:
        # 사용자로부터 메시지 입력
        message = input()
        
        # 서버로 메시지 전송
        client_socket.send(message.encode('utf-8'))

def main():
    # 소켓 생성 및 서버에 연결
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client_socket.connect((HOST, PORT))
    
    # 서버로부터 받은 메시지를 출력하는 스레드 생성
    receive_thread = threading.Thread(target=receive_message, args=(client_socket,))
    receive_thread.start()
    
    # 사용자의 입력을 서버로 전송하는 스레드 생성
    send_thread = threading.Thread(target=send_message, args=(client_socket,))
    send_thread.start()

if __name__ == '__main__':
    main()

위의 코드는 간단한 채팅 클라이언트를 구현하기 위한 코드입니다. 클라이언트는 서버에 연결하여 입력한 메시지를 서버로 전송하고, 서버로부터 받은 메시지를 출력합니다. 입력과 출력은 별도의 스레드에서 처리되므로 동시에 서버와의 통신을 할 수 있습니다.

실행하기

  1. 서버를 먼저 실행합니다.
  2. 클라이언트를 여러 개 실행해서 서버에 연결합니다.
  3. 클라이언트 간에 메시지를 주고받으면서 채팅을 즐깁니다.

이제 Python과 Socket 모듈을 사용하여 간단한 채팅 애플리케이션을 만들 수 있게 되었습니다. Socket을 이용한 네트워크 통신은 다양한 애플리케이션에서 사용될 수 있는 중요한 개념이니, 자세히 공부해보시기를 권장합니다.