[파이썬] 소켓 프로그래밍과 데이터 전송 중단 및 복구

소켓 프로그래밍은 네트워크 통신을 위한 기술로, 데이터를 전송하고 받는 데 사용됩니다. 이러한 데이터 전송 과정에서 중단 및 복구에 대한 고려가 필요합니다. 만약 중간에 네트워크 연결이 끊어지거나 오류가 발생한다면, 어떻게 데이터 손실을 최소화하고 전송을 재개할 수 있을까요? 이번 글에서는 파이썬을 사용한 소켓 프로그래밍에서 데이터 전송 중단 및 복구에 대해 다루어보겠습니다.

소켓 프로그래밍 기본

먼저 소켓 프로그래밍의 기본 개념을 간단히 살펴보겠습니다. 소켓은 프로세스 간 통신을 가능하게 하는 종단점입니다. 클라이언트 소켓은 서버 소켓에 연결하여 데이터를 전송하고, 서버 소켓은 클라이언트 소켓의 연결을 받아들이고 데이터를 수신합니다. 데이터는 전송 계층 프로토콜인 TCP 또는 UDP를 사용하여 송수신됩니다.

파이썬에서는 socket 모듈을 사용하여 소켓 프로그래밍을 구현할 수 있습니다. 예를 들어, 다음은 서버 소켓을 생성하고 클라이언트의 연결을 기다리는 예제 코드입니다.

import socket

# 서버 소켓 생성
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 서버 소켓을 로컬 호스트와 포트 12345에 바인딩
server_socket.bind(('localhost', 12345))

# 클라이언트의 연결을 기다림
server_socket.listen()

# 클라이언트의 연결을 받아들임
client_socket, addr = server_socket.accept()

# 클라이언트 소켓으로부터 데이터 수신
data = client_socket.recv(1024)

# 수신한 데이터 출력
print(data)

# 소켓 연결 종료
client_socket.close()
server_socket.close()

데이터 전송 중단 및 복구

이제 데이터 전송 중단 및 복구에 대해 알아보겠습니다. 전송 중단은 네트워크 상태, 클라이언트 또는 서버 오류 등으로 인해 발생할 수 있습니다. 이러한 경우 데이터 전송을 재개하려면 어떻게 해야 할까요?

예외 처리

데이터 전송 중단 시 예외 처리를 통해 오류를 감지하여 처리할 수 있습니다. 예외 처리는 try-except 구문을 사용하여 수행합니다. 소켓 프로그래밍에서는 socket.error 예외를 처리하여 오류를 처리할 수 있습니다.

import socket

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

try:
    # 서버 소켓에 연결
    client_socket.connect(('localhost', 12345))
    
    # 데이터 전송
    client_socket.send(b'Hello, Server!')
    
    # 데이터 수신
    data = client_socket.recv(1024)
    
    # 수신한 데이터 출력
    print(data)
    
except socket.error as e:
    # 오류 처리
    print(f'Error: {e}')
    
finally:
    # 소켓 연결 종료
    client_socket.close()

데이터 전송 재시도

데이터 전송 중단 시 데이터를 재전송할 수 있습니다. 이를 위해 while 루프를 사용하여 데이터가 전송될 때까지 계속해서 전송을 시도합니다.

import socket

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

try:
    retry = True
    while retry:
        try:
            # 서버 소켓에 연결
            client_socket.connect(('localhost', 12345))
            
            # 데이터 전송
            client_socket.send(b'Hello, Server!')
            
            # 데이터 수신
            data = client_socket.recv(1024)
            
            # 수신한 데이터 출력
            print(data)
            
            retry = False
            
        except socket.error:
            # 오류 처리
            print('Error: Connection failed. Retrying...')
            
except KeyboardInterrupt:
    print('Program terminated by user.')
    
finally:
    # 소켓 연결 종료
    client_socket.close()

데이터 전송 상태 확인

데이터 전송 시간 및 전송 상태를 확인하는 것도 중요합니다. 소켓 프로그래밍에서는 settimeout 메서드를 사용하여 소켓의 타임아웃 시간을 설정할 수 있습니다. 또한 sendall 메서드를 사용하여 데이터가 모두 전송될 때까지 대기할 수 있습니다.

import socket

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

try:
    # 서버 소켓에 연결
    client_socket.connect(('localhost', 12345))
    
    # 타임아웃 시간 설정 (10초)
    client_socket.settimeout(10)
    
    # 데이터 전송
    client_socket.sendall(b'Hello, Server!')
    
    # 데이터 수신
    data = client_socket.recv(1024)
    
    # 수신한 데이터 출력
    print(data)
    
except socket.timeout:
    print('Error: Connection timeout.')
    
except socket.error as e:
    # 오류 처리
    print(f'Error: {e}')
    
finally:
    # 소켓 연결 종료
    client_socket.close()

마무리

이번 글에서는 파이썬을 사용한 소켓 프로그래밍에서 데이터 전송 중단 및 복구에 대해 알아보았습니다. 예외 처리, 데이터 전송 재시도, 데이터 전송 상태 확인 등을 통해 데이터 전송 과정에서 발생할 수 있는 문제에 유연하게 대처할 수 있습니다. 안전하고 신뢰성 있는 데이터 전송을 위해 이러한 기술을 적절히 활용하면 좋습니다.