- 1:1 터미널 채팅 완성하기2026년 06월 22일
- 소쩍소쩍이
- 작성자
- 2026.06.22.:01
준비하기 - 대화 순서 정하기
이번 채팅 프로그램은 아래 순서로 동작한다.
① 클라이언트가 먼저 보낸다
↓
② 서버가 받는다
↓
③ 서버가 답장을 입력해서 보낸다
↓
④ 클라이언트가 받는다
↓
⑤ 이 과정을 반복한다. (while True)중요
양쪽이 동시에 input()을 하거나 동시에 recv()를 하는 구조가 아니다.
한쪽이 보내면 다른 쪽이 받고, 다시 반대쪽이 보내는 방식으로 순서를 맞춰야 한다.서버 - 대화 구현
import socket HOST = "127.0.0.1" PORT = 5000 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server_socket: server_socket.bind((HOST, PORT)) server_socket.listen() print("서버를 시작합니다.") print("클라이언트 접속 대기 중...") client_socket, client_address = server_socket.accept() with client_socket: print(f"클라이언트가 접속했습니다: {client_address}") print("채팅을 시작합니다. 종료하려면 exit을 입력하세요.") while True: data = client_socket.recv(1024) # 클라이언트가 갑자기 연결을 끊은 경우 처리 if not data: print("클라이언트 연결이 종료되었습니다.") break client_message = data.decode("utf-8") # 클라이언트가 exit을 보낸 경우 종료 if client_message == "exit": print("클라이언트가 채팅을 종료했습니다.") break print(f"클라이언트: {client_message}") # 서버 사용자가 직접 답장 입력 server_message = input("서버: ") client_socket.send(server_message.encode("utf-8")) # 서버도 exit을 입력해 종료 가능 if server_message == "exit": print("서버가 채팅을 종료했습니다.") break print("서버를 종료합니다.")서버 코드의 핵심 흐름
서버는 먼저 클라이언트의 메시지를 받은 뒤, 서버 사용자가 직접 답장을 입력해 다시 클라이언트에게 보낸다.
클라이언트 메시지 받기
↓
받은 메시지가 exit인지 확인
↓
받은 메시지 출력
↓
서버 사용자가 답장 입력
↓
답장 전송
↓
서버 답장이 exit인지 확인클라이언트 - 대화 구현
import socket HOST = "127.0.0.1" PORT = 5000 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as client_socket: client_socket.connect((HOST, PORT)) print("서버에 연결되었습니다.") print("채팅을 시작합니다. 종료하려면 exit을 입력하세요.") while True: client_message = input("클라이언트: ") # exit도 서버에 먼저 보내고 나서 종료 client_socket.send(client_message.encode("utf-8")) if client_message == "exit": print("클라이언트가 채팅을 종료했습니다.") break data = client_socket.recv(1024) # 서버가 갑자기 연결을 끊은 경우 처리 if not data: print("서버 연결이 종료되었습니다.") break server_message = data.decode("utf-8") # 서버가 exit을 보낸 경우 종료 if server_message == "exit": print("서버가 채팅을 종료했습니다.") break print(f"서버: {server_message}") print("클라이언트 소켓을 닫았습니다.")서버와 클라이언트 순서 맞추기
순서가 어긋나면 양쪽 모두 recv()에서 기다리거나, 한쪽은 입력을 기다리고 다른 쪽은 응답을 기다리는 상황이 생길 수 있다.
아래 표는 서버와 클라이언트가 어떤 순서로 동작해야 하는지 정리한 내용이다.
순서 클라이언트 서버 1 input() recv() 대기 2 send() 메시지 수신·출력 3 recv() 대기 input() 4 답장 수신·출력 send() 주의
서버와 클라이언트가 동시에 recv()를 실행하면 둘 다 상대방의 메시지를 기다리게 된다.
따라서 누가 먼저 보내고 누가 먼저 받을지 순서를 반드시 맞춰야 한다.흔한 오류와 해결 방법
채팅 프로그램을 만들 때 자주 발생하는 오류는 대부분 send(), recv(), exit 처리 순서에서 발생한다.
오류 상황 원인 해결 방법 번갈아 말하기 중 양쪽이 멈춤 클라이언트와 서버 모두 recv()에서 기다리는 순서 오류 클라이언트는 먼저 send(), 서버는 먼저 recv() 구조인지 확인한다 exit을 입력했는데 한쪽만 종료됨 exit을 보내지 않고 바로 break하거나, 받은 exit을 처리하지 않음 send() 후 break하고, 받은 메시지가 exit인지 확인하는 코드를 양쪽에 넣는다 서버가 exit 입력 시 클라이언트가 계속 입력을 기다림 클라이언트 코드에 서버의 exit 수신 처리가 없음 클라이언트 recv() 후 if server_message == "exit": break 조건이 있는지 확인한다 정리
양방향 채팅을 만들 때 가장 중요한 것은 대화 순서를 맞추는 것이다.
클라이언트가 먼저 메시지를 보내고,
서버는 그 메시지를 받은 뒤 답장을 입력해서 다시 보낸다.
서버와 클라이언트가 동시에 recv()를 실행하면 서로 기다리기만 하는 상태가 될 수 있으므로, send()와 recv()의 순서를 정확히 맞춰야 한다.'Server - Client' 카테고리의 다른 글
스레드 개념과 기초 사용법 (0) 2026.06.23 여러 클라이언트 접속 구조 (0) 2026.06.23 반복 송수신과 종료 처리 (0) 2026.06.22 클라이언트 만들기 (0) 2026.06.22 서버 만들기 (0) 2026.06.22 다음글이전글이전 글이 없습니다.댓글
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)