Python

Python - 네트워킹

thebasics 2024. 11. 19. 17:00

목차

  1. 네트워킹이란?
  2. 소켓 프로그래밍의 개념
  3. 소켓 생성 및 기본 사용법
    • 소켓 생성
    • 서버와 클라이언트의 통신
  4. TCP와 UDP 소켓
    • TCP 소켓
    • UDP 소켓
  5. 예시 코드
  6. 결론
  7. 관련 자료 및 추가 학습 자료

1. 네트워킹이란?

네트워킹은 컴퓨터 시스템 간에 데이터를 교환하는 과정입니다. 이를 통해 분산된 시스템이 서로 데이터를 주고받거나 리소스를 공유할 수 있습니다. Python에서는 socket 모듈을 사용하여 네트워크 프로그래밍을 간단하고 효율적으로 구현할 수 있습니다. 소켓 프로그래밍은 네트워크 기반 애플리케이션 개발의 핵심이며, 서버와 클라이언트 간의 통신을 구현할 수 있습니다.


2. 소켓 프로그래밍의 개념

소켓 프로그래밍은 두 호스트 간의 네트워크 통신을 구현하는 방법입니다. 소켓은 네트워크 상에서 실행되는 프로그램 간의 통신 끝점을 나타냅니다. 네트워크 통신은 일반적으로 클라이언트와 서버 간의 상호 작용을 기반으로 하며, 소켓을 사용하여 이 통신을 설정하고 관리할 수 있습니다.

  • 소켓의 종류:
    • TCP 소켓: 연결 지향적이며, 데이터의 순서와 신뢰성을 보장합니다.
    • UDP 소켓: 비연결 지향적이며, 데이터 전송 속도가 빠르지만 순서와 신뢰성을 보장하지 않습니다.

3. 소켓 생성 및 기본 사용법

소켓 생성

Python에서 소켓을 생성하려면 socket 모듈을 사용합니다. socket.socket() 함수는 새로운 소켓 객체를 생성하며, 소켓 유형과 프로토콜을 지정할 수 있습니다.

  • 구문:
    import socket
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    • AF_INET은 IPv4 주소 체계를 사용함을 나타내며, SOCK_STREAM은 TCP 소켓을 의미합니다.

서버와 클라이언트의 통신

네트워킹에서는 일반적으로 서버와 클라이언트 간의 통신이 이루어집니다. 서버는 특정 포트에서 클라이언트의 연결을 기다리고, 클라이언트는 서버에 연결을 요청합니다.

  • 서버 생성 및 실행:

    import socket
    
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind(('localhost', 8080))  # 호스트와 포트를 바인딩
    server_socket.listen(1)  # 연결을 대기하는 클라이언트 수
    
    print("서버가 실행 중입니다. 연결을 기다리는 중...")
    client_socket, addr = server_socket.accept()  # 클라이언트 연결 허용
    print(f"클라이언트가 {addr}로 연결되었습니다.")
    
    client_socket.sendall(b"Hello, Client!")
    client_socket.close()
    server_socket.close()
    • 서버는 bind()를 사용하여 IP 주소와 포트를 설정하고, listen()으로 연결을 대기합니다. accept()는 클라이언트의 연결을 수락하고, 연결된 소켓 객체를 반환합니다.
  • 클라이언트 생성 및 실행:

    import socket
    
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client_socket.connect(('localhost', 8080))  # 서버에 연결
    
    data = client_socket.recv(1024)  # 서버로부터 데이터 수신
    print("서버로부터 받은 메시지:", data.decode())
    
    client_socket.close()
    • 클라이언트는 connect()를 사용하여 서버에 연결하고, recv()를 통해 서버로부터 데이터를 수신합니다.

4. TCP와 UDP 소켓

TCP 소켓

TCP(Transmission Control Protocol)는 연결 지향적 프로토콜로, 데이터의 신뢰성과 순서를 보장합니다. 서버와 클라이언트는 연결을 설정한 후 데이터를 주고받으며, 전송된 데이터가 손실되거나 순서가 변경되지 않도록 보장합니다.

  • TCP 소켓 생성:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    • SOCK_STREAM을 사용하여 TCP 소켓을 생성합니다.

UDP 소켓

UDP(User Datagram Protocol)는 비연결 지향적 프로토콜로, 데이터의 빠른 전송이 필요하지만 신뢰성과 순서가 중요하지 않은 경우에 사용됩니다. 데이터그램으로 통신하며, 송신자는 데이터를 보내고 수신자는 데이터를 받는 구조입니다.

  • UDP 소켓 생성:

    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    • SOCK_DGRAM을 사용하여 UDP 소켓을 생성합니다.
  • UDP 서버:

    import socket
    
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    server_socket.bind(('localhost', 8080))
    
    print("UDP 서버가 실행 중입니다. 데이터 수신 대기 중...")
    data, addr = server_socket.recvfrom(1024)
    print(f"{addr}로부터 받은 메시지: {data.decode()}")
    
    server_socket.sendto(b"Hello, UDP Client!", addr)
    server_socket.close()
  • UDP 클라이언트:

    import socket
    
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    client_socket.sendto(b"Hello, UDP Server!", ('localhost', 8080))
    
    data, addr = client_socket.recvfrom(1024)
    print("서버로부터 받은 메시지:", data.decode())
    
    client_socket.close()

5. 예시 코드

TCP 서버 및 클라이언트 예시

  • TCP 서버:

    import socket
    
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind(('localhost', 9090))
    server_socket.listen(1)
    
    print("서버가 실행 중입니다...")
    client_socket, addr = server_socket.accept()
    print(f"클라이언트가 {addr}로 연결되었습니다.")
    
    while True:
        data = client_socket.recv(1024)
        if not data:
            break
        print("클라이언트로부터 받은 데이터:", data.decode())
        client_socket.sendall(data)
    
    client_socket.close()
    server_socket.close()
  • TCP 클라이언트:

    import socket
    
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client_socket.connect(('localhost', 9090))
    
    try:
        while True:
            message = input("메시지를 입력하세요: ")
            if message == 'exit':
                break
            client_socket.sendall(message.encode())
            data = client_socket.recv(1024)
            print("서버로부터 받은 데이터:", data.decode())
    finally:
        client_socket.close()

6. 결론

Python의 socket 모듈은 소켓 프로그래밍을 통해 네트워크 기반 애플리케이션을 개발하는 데 유용한 도구를 제공합니다. 소켓 프로그래밍을 사용하면 TCP와 UDP를 활용하여 서버와 클라이언트 간의 통신을 구현할 수 있습니다. 이를 통해 채팅 프로그램, 게임 서버, 파일 전송 시스템 등 다양한 네트워크 애플리케이션을 개발할 수 있습니다. 네트워킹의 기본 개념과 소켓 프로그래밍을 이해하고 이를 활용하여 네트워크 기반 애플리케이션을 구축해 보세요.


7. 관련 자료 및 추가 학습 자료


이 글에서는 Python에서 소켓 프로그래밍을 사용하여 네트워크 기반 애플리케이션을 개발하는 방법을 살펴보았습니다. TCP와 UDP를 활용한 서버와 클라이언트 간의 통신 구현 방법을 이해하고 이를 활용하여 네트워킹 애플리케이션을 개발해 보세요.

반응형