반응형
소개
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) 적용 방법도 학습해보길 추천합니다.
관련 내용
반응형