본문 바로가기
실전 예제, 프로젝트

[실전 예제/소켓통신/루프백] 컴퓨터 한 대로 가능한 TCP/IP

by First Adventure 2025. 1. 15.
반응형

소개

  TCP/IP는 네트워크 통신에서 가장 널리 사용되는 프로토콜 중 하나로, 데이터를 안정적으로 송수신할 수 있는 기반을 제공합니다. 본 글에서는 Python을 활용해 루프백(127.0.0.1)을 기반으로 한 TCP/IP 서버-클라이언트 통신을 구현하는 방법을 살펴보겠습니다.

 

루프백 TCP/IP란?

  루프백은 네트워크 내부에서 데이터를 송수신하기 위한 가상의 네트워크 인터페이스입니다. IP 주소 127.0.0.1은 호스트 머신 자신을 나타내며, 네트워크 테스트나 로컬 환경에서의 통신을 구현할 때 유용하게 사용됩니다.

 

구현 목표

  • 서버는 포트 5000에서 클라이언트 요청을 대기합니다.
  • 클라이언트는 서버에 메시지를 전송하고 서버로부터 응답을 받습니다.
  • 서버는 클라이언트와의 연결을 유지하며 여러 요청을 처리할 수 있어야 합니다.

 

Python 구현

서버 코드

  다음은 클라이언트와의 연결을 멀티스레드로 처리하는 TCP 서버 코드입니다.

import socket
import threading

def handle_client(conn, addr):
    print(f"[NEW CONNECTION] {addr} connected.")
    try:
        while True:
            data = conn.recv(1024)
            if not data:
                print(f"[DISCONNECTED] {addr} disconnected.")
                break
            print(f"[{addr}] Received: {data.decode()}")
            response = f"Server response: {data.decode()}"
            conn.send(response.encode())
    except ConnectionResetError:
        print(f"[ERROR] Connection with {addr} was reset.")
    finally:
        conn.close()

def tcp_server():
    host = '127.0.0.1'
    port = 5000
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server_socket.bind((host, port))
    server_socket.listen()
    print(f"[LISTENING] Server is listening on {host}:{port}")

    while True:
        conn, addr = server_socket.accept()
        thread = threading.Thread(target=handle_client, args=(conn, addr))
        thread.start()
        print(f"[ACTIVE CONNECTIONS] {threading.active_count() - 1}")

if __name__ == "__main__":
    tcp_server()

클라이언트 코드

  서버와의 연결을 통해 메시지를 송수신하는 클라이언트 코드입니다.

import socket

def tcp_client():
    server_host = '127.0.0.1'
    server_port = 5000
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client_socket.connect((server_host, server_port))
    print(f"Connected to server at {server_host}:{server_port}")

    try:
        while True:
            message = input("Enter message to send (type 'exit' to quit): ")
            if message.lower() == 'exit':
                break
            client_socket.send(message.encode())
            response = client_socket.recv(1024)
            print(f"Received from server: {response.decode()}")
    finally:
        client_socket.close()

if __name__ == "__main__":
    tcp_client()

 

실행 방법

1. 서버 실행: 터미널에서 서버 코드를 실행합니다.

python3 server.py

 

2. 클라이언트 실행: 다른 터미널에서 클라이언트 코드를 실행합니다.

python3 client.py

 

3. 통신 테스트: 클라이언트 터미널에서 메시지를 전송하면, 서버가 메시지를 수신한 뒤 응답을 반환합니다.

 

예제 출력

클라이언트

Connected to server at 127.0.0.1:5000
Enter message to send (type 'exit' to quit): Hello, Server!
Received from server: Server response: Hello, Server!

 

서버

[LISTENING] Server is listening on 127.0.0.1:5000
[NEW CONNECTION] ('127.0.0.1', 54321) connected.
[ACTIVE CONNECTIONS] 1
[('127.0.0.1', 54321)] Received: Hello, Server!

 

 

마무리

  이 글에서는 Python을 활용해 TCP/IP 통신을 구현하고 루프백 주소를 사용하여 서버-클라이언트 간 데이터를 송수신하는 방법을 알아보았습니다. 이번 실습은 여러분들이 네트워크 통신의 기본을 이해하고 응용하기 위한 좋은 출발점이 되리라 생각합니다.
  추가적으로, 비동기 방식(asyncio)나 보안(SSL/TLS) 적용 방법도 학습해보길 추천합니다.

 

관련 내용

 

반응형