- 반복 송수신과 종료 처리2026년 06월 22일
- 소쩍소쩍이
- 작성자
- 2026.06.22.:46
반복 송수신 구조 만들기
이전까지는 메시지를 한 번만 주고받고 프로그램이 종료되었다. 실제 채팅 프로그램처럼 여러 번 메시지를 주고받기 위해서는 반복 구조가 필요하다.
한계 이유 메시지를 한 번만 보낼 수 있다 송수신 코드가 반복문 안에 있지 않다 사용자가 직접 메시지를 입력하지 않는다 메시지가 코드 안에 고정되어 있다 종료 기준이 명확하지 않다 연결을 언제 끝낼지 정하는 조건이 없다 이러한 한계를 해결하기 위해 while True 반복문을 사용한다.
중요
채팅 프로그램은 한 번 통신하고 끝나는 것이 아니라 반복적으로 메시지를 주고받는 구조가 필요하다.종료 규칙 만들기
사용자가 exit를 입력하면 프로그램을 종료하도록 규칙을 정한다.
중요한 점은 클라이언트가 exit를 서버에 먼저 보내고 나서 종료해야 한다. 만약 클라이언트가 바로 종료되면 서버는 왜 연결이 끊어졌는지 알 수 없다.
핵심
exit 입력 → send() 전송 → break 실행
순서를 반드시 지켜야 한다.서버 - 반복 구조와 종료 조건
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}") while True: data = client_socket.recv(1024) # 클라이언트 연결이 갑자기 끊겼을 때 종료 if not data: print("클라이언트 연결이 종료되었습니다.") break message = data.decode("utf-8") print(f"클라이언트 메시지: {message}") if message == "exit": print("클라이언트가 종료를 요청했습니다.") break response = f"서버 응답: {message}" client_socket.send(response.encode("utf-8")) print("응답 메시지를 보냈습니다.") print("서버를 종료합니다.")코드 의미 if not data: 클라이언트 연결이 갑자기 끊겼을 때 종료하는 안전장치 if message == "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: message = input("보낼 메시지: ") # exit도 서버에 먼저 전송 client_socket.send(message.encode("utf-8")) if message == "exit": print("서버와의 연결을 종료합니다.") break data = client_socket.recv(1024) response = data.decode("utf-8") print(response) print("클라이언트 소켓을 닫았습니다.")참고
서버와 클라이언트 모두 while True를 사용하지만 역할은 다르다.
서버는 메시지를 계속 받기 위해 반복하고,
클라이언트는 사용자의 입력을 계속 받기 위해 반복한다.동작 흐름
순서 동작 1 클라이언트가 메시지 입력 2 send()로 서버에 전송 3 서버가 recv()로 수신 4 서버가 응답 생성 5 서버가 send()로 응답 전송 6 클라이언트가 recv()로 응답 수신 7 사용자가 exit 입력 시 양쪽 종료 흔한 오류와 해결 방법
오류 상황 원인 해결 방법 exit을 입력했는데 서버가 끝나지 않음 클라이언트가 exit을 서버에 보내기 전에 종료함 send()를 먼저 실행한 뒤 break를 실행 입력 후 응답이 오지 않음 send() 코드 위치가 잘못됨 while True 내부에 있는지 확인 서버가 빈 메시지를 계속 처리함 클라이언트가 갑자기 종료됨 if not data: break 추가 while True가 끝나지 않음 break 조건이 없음 종료 조건을 추가 recv()에서 멈춘 것처럼 보임 상대방이 send()를 하지 않음 send()/recv() 순서를 확인 정리
채팅 프로그램처럼 여러 번 메시지를 주고받기 위해서는 while True 반복문이 필요하다.
서버는 recv()로 메시지를 받고 응답을 보내며, 클라이언트는 사용자 입력을 받아 서버에 전송한다.
또한 exit를 이용한 종료 규칙과 if not data를 이용한 예외 처리까지 추가하면 보다 안정적인 네트워크 프로그램을 만들 수 있다.'Server - Client' 카테고리의 다른 글
여러 클라이언트 접속 구조 (0) 2026.06.23 1:1 터미널 채팅 완성하기 (0) 2026.06.22 클라이언트 만들기 (0) 2026.06.22 서버 만들기 (0) 2026.06.22 소켓의 역할과 동작 흐름 (0) 2026.06.22 다음글이전글이전 글이 없습니다.댓글
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)