[파이썬] 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()
위의 코드는 간단한 채팅 클라이언트를 구현하기 위한 코드입니다. 클라이언트는 서버에 연결하여 입력한 메시지를 서버로 전송하고, 서버로부터 받은 메시지를 출력합니다. 입력과 출력은 별도의 스레드에서 처리되므로 동시에 서버와의 통신을 할 수 있습니다.
실행하기
- 서버를 먼저 실행합니다.
- 클라이언트를 여러 개 실행해서 서버에 연결합니다.
- 클라이언트 간에 메시지를 주고받으면서 채팅을 즐깁니다.
이제 Python과 Socket 모듈을 사용하여 간단한 채팅 애플리케이션을 만들 수 있게 되었습니다. Socket을 이용한 네트워크 통신은 다양한 애플리케이션에서 사용될 수 있는 중요한 개념이니, 자세히 공부해보시기를 권장합니다.