• 티스토리 홈
  • 프로필사진
    소쩍소쩍이
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
소쩍소쩍이
  • 프로필사진
    소쩍소쩍이
    • 분류 전체보기 (89)
      • 파이썬 (18)
        • 문제 및 예제 (8)
      • PySide6 (24)
        • Signal & Slot (6)
        • Layout (8)
        • Model & View (3)
        • File (4)
        • Resource (3)
      • Server - Client (17)
        • GUI 채팅 (1)
      • MySQL (4)
      • 리눅스 (5)
      • 아두이노 (0)
      • 일지 (20)
  • GitHub
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    # Home
    # 공지사항
    #
    # 태그
    # 검색결과
    # 방명록
    • 반복 송수신과 종료 처리
      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일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
    목차
    표시할 목차가 없습니다.
      • 안녕하세요
      • 감사해요
      • 잘있어요

      티스토리툴바