본문 바로가기
Python/파이썬 문법

(Python) 파이썬 TCP 소켓 통신 (서버/클라이언트)

by 미니몬 2024. 1. 11.

목차

    728x90
    반응형

    Summary

    TCP (Transmission Control Protocol)는 컴퓨터 네트워크에서 데이터를 안정적으로 전송하기 위한 프로토콜 중 하나로, 서버와 클라이언트 간에 양방향 통신을 가능하게 합니다. 파이썬에서는 socket 모듈을 사용하여 TCP 소켓 통신을 구현할 수 있습니다.

    파이썬 socket 모듈을 활용하여 서버와 클라이언트간 데이터를 주고 받는 상황을 예제를 통해 알아보도록 하겠습니다.

     

     

    1) 서버와 클라이언트

    • 서버(Server) : 서버는 특정 IP 주소와 포트 번호를 열어 대기하고, 클라이언트의 연결 요청을 기다립니다.
      연결 후 클라이언트로부터 요청을 처리하며 응답을 반환하는 역할을 합니다.
    • 클라이언트(Client) : 클라이언트는 서버에 연결하고 요청을 보내며 서버로부터 응답을 받습니다. 클라이언트는 서버의 IP 주소와 포트 번호를 사용하여 서버에 연결합니다.

    즉, 서버(Server)는 서비스를 제공하는 입장이며, 클라이언트(Client)는 서버에게 필요한 서비스를 응답받는 입장입니다.

     

     

    2) TCP 소켓 통신의 프로세스

    1. 서버 소켓 생성 : 서버는 특정 IP 주소와 포트 번호에서 클라이언트의 연결을 수락하기 위해 서버 소켓을 생성합니다.

    2. 서버 바인딩 : 서버 소켓은 서버의 IP 주소와 포트 번호에 바인딩됩니다.

    3. 서버 리스닝 : 서버 소켓은 클라이언트의 연결을 대기하기 위해 리스닝 모드로 설정됩니다.

    4. 클라이언트 연결 수락 : 클라이언트가 서버에 연결을 요청하면, 서버는 해당 연결을 수락하고 클라이언트와 통신할 수 있는 새로운 소켓을 생성합니다.

    5. 데이터 교환 : 서버와 클라이언트 간에 데이터를 교환합니다. 데이터를 보내고 받을 때는 소켓의 입출력 스트림을 사용합니다.

    6. 연결 종료 : 통신이 완료되면 서버와 클라이언트는 연결을 종료합니다.

     

     

    3-1) 파이썬 예제 (서버)

    간단한 서버/클라이언트 TCP 소켓 통신을 이해하기 위한 예제를 알아보겠습니다.

    서버측은 port를 바인딩하고 대기상태의 소켓을 생성하고 요청을 기다립니다.

    import socket
    
    # 서버 설정
    host = "0.0.0.0"  # 서버의 IP 주소 또는 도메인 이름
    port = 12345       # 포트 번호
    
    # 서버 소켓 생성
    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, client_address = server_socket.accept()
        print(f"클라이언트 {client_address}가 연결되었습니다.")
        
        try:
            # 클라이언트로부터 요청 받기
            data = client_socket.recv(1024).decode("utf-8")
            if not data:
                continue
    
            # 요청 파싱
            parts = data.split("&&")
            if len(parts) != 0:
                name = parts[0]
                message = parts[1]
                response = f"어서와! {name}"
    
                # 클라이언트 이름과 메시지 출력
                print(f"클라이언트 이름: {name}")
                print(f"클라이언트 메시지: {message}")
            else:
                response = "유효하지 않은 요청"
    
            # 응답 클라이언트에게 전송
            client_socket.send(response.encode("utf-8"))
    
        except Exception as e:
            print(f"오류 발생: {e}")
    
        finally:
            # 클라이언트 소켓 닫기
            print("연결종료")
            client_socket.close()

    host를 0.0.0.0 으로 한다는 것은 모든 IP를 뜻하고, 특정 IP 및 도메인을 사용하는 경우 수정해주시면 됩니다.

    port 정보는 서버측에서 접속 대기할 port 를 지정해주시면 됩니다.

     

     

    3-2) 파이썬 예제 (클라이언트)

    서버의 IP와 port를 기재하고 서버로 요청할 메시지를 보내고 응답 받는 것을 확인해보겠습니다.

    import socket
    
    # 서버 설정
    server_address = "서버IP"  # 서버의 실제 IP 주소 또는 도메인 이름
    server_port = 12345         # 서버 포트 번호
    
    # 서버에 연결
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client_socket.connect((server_address, server_port))
    
    # 데이터 전송
    name = "미니몬"
    message = "안녕, 서버!"
    
    request = f"{name}&&{message}"
    client_socket.send(request.encode("utf-8"))
    
    # 서버로부터 응답 받기
    response = client_socket.recv(1024).decode("utf-8")
    print(f"{name} : {message}")
    print(f"서버 : {response}\n")
    
    # 클라이언트 소켓 닫기
    client_socket.close()

     

     

    4) 실행

    1) 먼저 서버측에서 실행하면 대기 상태로 들어갑니다.

     

    2) 클라이언트에서 서버로 보낸 요청에 대해서 응답을 확인합니다.

     

    3) 서버측은 클라이언트의 요청에 대한 응답을 완료하면 연결을 종료합니다.

     

     

    이러한 예제는 서버와 클라이언트 간에 간단한 텍스트 메시지를 주고받는 방법을 보여주며, 파이썬을 사용하여 TCP 소켓 통신을 구현하는 기초를 이해하는 데 도움이 될 것입니다. 실제 애플리케이션에서는 보안, 에러 처리, 프로토콜 정의 및 다른 고려 사항을 추가로 고려할 사항이 많이 있습니다.

     

    728x90
    반응형