간단한 서버 클라이언트 파이썬 채팅 프로그램 만드는법

안녕하세요. 잘산다 코딩 블로그입니다. 오늘은 파이썬 채팅 프로그램 만들기에 대해 알아보겠습니다.

파이썬 채팅 프로그램이란?
여러 클라이언트가 서버에 접속하여 실시간으로 메시지를 주고받는 프로그램입니다. 이 프로그램을 만들기 위해서는 파이썬의 socket, threading, queue 모듈을 사용해야 합니다. 각 모듈들의 기본적인 사용법과 채팅 프로그램의 구조에 대해 설명하고 예제 코드를 제공하겠습니다.
파이썬 채팅 프로그램의 구조
파이썬 채팅 프로그램은 크게 서버와 클라이언트로 구분됩니다. 서버는 클라이언트의 접속을 받아주고, 클라이언트가 보낸 메시지를 다른 클라이언트에게 전달하는 역할을 합니다.
이후 클라이언트는 서버에 접속하고, 메시지를 입력하거나 받아서 화면에 출력하는 역할을 합니다.
socket 모듈을 이용하여 네트워크 통신을 하는데, socket 모듈은 TCP/IP 프로토콜을 기반으로 소켓을 생성하고 소켓을 통해 데이터를 주고받을 수 있게 해줍니다. IP 주소와 포트 번호로 식별되며, 서버는 특정 포트 번호로 소켓을 열어서 클라이언트의 접속을 기다리고, 클라이언트는 서버의 IP 주소와 포트 번호로 소켓을 연결하여 통신을 시작합니다.
파이썬 채팅 프로그램의 예제 코드
이제 파이썬 채팅 프로그램의 예제 코드를 살펴보겠습니다. 이 코드는 간단한 예제이므로 예외 처리나 보안 등의 고려사항은 생략하였습니다. 서버와 클라이언트는 같은 컴퓨터에서 실행되며 서버의 IP 주소와 포트 번호는 필요에 따라 변경하시면 됩니다.
서버 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
import socket import threading import queue server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind(('127.0.0.1', 9000)) server.listen() clients = [] messages = queue.Queue() # 메시지 전송 def send_message(): while True: # 큐에서 메시지를 꺼냄 message = messages.get() # 모든 클라이언트에게 메시지 전송 for client in clients: client.send(message) # 메시지 수신 def receive_message(client): while True: # 클라이언트로부터 메시지를 받음 message = client.recv(1024) # 메시지가 없으면 클라이언트 연결 종료 if not message: clients.remove(client) client.close() break # 메시지가 있으면 큐에 저장 messages.put(message) # 메시지 전송 스레드 생성 send_thread = threading.Thread(target=send_message) send_thread.start() while True: # 클라이언트 접속 수락 client, addr = server.accept() # 클라이언트 소켓 리스트에 추가 clients.append(client) receive_thread = threading.Thread(target=receive_message, args=(client,)) receive_thread.start() |
서버의 주요 내용
- 서버 소켓을 생성하고, ‘127.0.0.1:9000’으로 바인딩
- 클라이언트 소켓을 저장할 리스트와 메시지를 저장할 큐를 생성합니다.
- send_message 함수는 큐에서 메시지를 꺼내서 모든 클라이언트에게 전송하는 역할을 합니다. 이 함수는 별도의 스레드로 실행됩니다.
- receive_message 함수는 특정 클라이언트로부터 메시지를 받아서 큐에 저장하는 역할을 합니다. 이 함수는 클라이언트마다 별도의 스레드로 실행됩니다.
- 메인 스레드는 클라이언트의 접속을 수락하고, 클라이언트 소켓을 리스트에 추가하고, receive_message 함수를 스레드로 실행합니다.
클라이언트 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
import socket import threading import queue import sys from PyQt5.QtWidgets import QMainWindow, QApplication from PyQt5 import uic client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 서버의 IP로 소켓 연결 client.connect(('127.0.0.1', 9000)) # UI 파일 로드 ui_form = uic.loadUiType("client.ui")[0] # 채팅 창 class ChatWindow(QMainWindow, ui_form): def __init__(self): super().__init__() self.setupUi(self) # 전송 버튼 클릭 이벤트 연결 self.btn_send.clicked.connect(self.send_message) # 메시지 큐 생성 self.messages = queue.Queue() # 메시지 수신 스레드 생성 및 시작 self.receive_thread = threading.Thread(target=self.receive_message) self.receive_thread.start() # 메시지 출력 스레드 생성 및 시작 self.print_thread = threading.Thread(target=self.print_message) self.print_thread.start() # 메시지 전송 def send_message(self): # 입력창에서 메시지를 가져옴 message = self.input_message.toPlainText() # 메시지가 비어있지 않으면 if message: # 메시지를 바이트로 인코딩 message = message.encode() # 서버에 메시지 전송 client.send(message) # 입력창을 비움 self.input_message.setPlainText('') # 메시지 수신 def receive_message(self): while True: # 서버로부터 메시지를 받음 message = client.recv(1024) # 메시지가 없으면 연결 종료 if not message: client.close() break # 메시지가 있으면 큐에 저장 self.messages.put(message) # 메시지 출력 def print_message(self): while True: # 큐에서 메시지를 꺼냄 message = self.messages.get() # 메시지를 디코딩 message = message.decode() # 채팅창에 메시지 출력 self.chats.appendPlainText(message) # 애플리케이션 객체 생성 app = QApplication(sys.argv) # 채팅 창 객체 생성 myWindow = ChatWindow() # 채팅 창 제목 설정 myWindow.setWindowTitle('멍개 채팅') # 채팅 창 보여주기 myWindow.show() # 애플리케이션 실행 app.exec_() |
파이썬 채팅 프로그램의 실행 방법
파이썬 채팅 프로그램의 예제 코드를 작성했으니, 이제 실행해보겠습니다. 실행하기 위해서는 다음과 같은 순서로 진행합니다.
- 서버 코드를 server.py 파일로 저장하고, 터미널에서
python server.py
명령으로 실행합니다. 서버가 리스닝 상태가 되면, 다음과 같은 메시지가 출력됩니다.
1 2 |
Listening on 127.0.0.1:9000 |
- 클라이언트 코드를 client.py 파일로 저장하고, 터미널에서
python client.py
명령으로 실행합니다. 클라이언트가 서버에 접속하면 아래 메시지가 출력됩니다.
1 2 3 |
Connected to 127.0.0.1:9000 Enter your name: 잘산다 |
- 클라이언트는 이름을 입력하고, 엔터 키를 누릅니다.
1 2 |
Welcome, 잘산다! |
- 클라이언트는 채팅을 시작할 수 있습니다. 메시지를 입력하고 엔터 키를 누르면, 서버에 메시지가 전송되고 서버는 메시지를 받아서 다른 클라이언트들에게 전달합니다.
1 2 |
잘산다: 잘 살아라 |
- 클라이언트가 채팅을 종료하고 싶으면,
quit
이라고 입력하고 엔터를 누르면 됩니다.
1 2 |
Disconnected from 127.0.0.1:9000 |
이상으로 파이썬 채팅 프로그램 만들기에 대한 블로그 글을 마치겠습니다. 이 글이 여러분의 코딩 공부에 도움이 되었으면 좋겠습니다. 다른 유용한 코딩 정보를 보시려면 블로그 메인도 방문해주세요. 감사합니다.