[파이썬] socket JSON과 소켓 함께 사용하기

JSON (JavaScript Object Notation)은 데이터를 표현하고 교환하기 위한 경량화된 형식입니다. 소켓 (socket)은 네트워크 통신에서 데이터를 주고받기 위한 기술입니다. 이 글에서는 Python에서 JSON과 소켓을 함께 사용하는 방법을 알아보겠습니다.

소켓 통신 기본

먼저, 소켓 통신에 대한 기본적인 개념을 알아봅시다. 소켓은 IP 주소와 포트 번호를 사용하여 네트워크 상에서 프로세스 간에 데이터를 주고받는 통로입니다.

Python에서 소켓을 사용하기 위해서는 socket 모듈을 import 해야 합니다.

import socket

socket 모듈을 사용하여 소켓을 생성하고, 서버와 클라이언트 간에 데이터를 주고받을 수 있습니다.

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

# 클라이언트 소켓 생성
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

JSON 데이터 전송하기

JSON 데이터를 소켓을 통해 전송하기 위해서는 먼저 JSON 객체를 문자열로 변환해야 합니다. 이때 Python의 json 모듈을 사용할 수 있습니다.

import json

# JSON 객체 생성
data = {"name": "John", "age": 30, "city": "New York"}

# JSON 객체를 문자열로 변환
json_data = json.dumps(data)

이제 생성한 JSON 문자열을 소켓을 통해 전송할 준비가 되었습니다.

# 데이터 전송
client_socket.send(json_data.encode())

JSON 데이터 수신하기

클라이언트에서 전송한 JSON 데이터를 서버에서 수신하기 위해서는 소켓을 통해 데이터를 받아온 후, 다시 JSON 객체로 변환해야 합니다.

# 데이터 수신
received_data = server_socket.recv(1024).decode()

# 수신한 데이터를 JSON 객체로 변환
json_received_data = json.loads(received_data)

이제 json_received_data 변수에는 수신한 JSON 데이터가 Python에서 사용할 수 있는 형태로 저장되었습니다.

예제 코드

다음은 서버와 클라이언트 간에 JSON 데이터를 주고받는 예제 코드입니다.

서버 (server.py):

import socket
import json

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

# 서버 주소와 포트 설정
server_address = ('localhost', 8080)
server_socket.bind(server_address)
server_socket.listen(1)

while True:
    print('Waiting for a client connection...')
    client_socket, client_address = server_socket.accept()
    print('Client connected:', client_address)

    # 데이터 수신
    received_data = client_socket.recv(1024).decode()
    print('Received:', received_data)

    # 수신한 데이터를 JSON 객체로 변환
    json_received_data = json.loads(received_data)
    print('JSON:', json_received_data)

    # JSON 객체 생성
    response_data = {"message": "Hello from server"}

    # JSON 객체를 문자열로 변환
    json_response_data = json.dumps(response_data)

    # 데이터 전송
    client_socket.send(json_response_data.encode())
    print('Sent:', json_response_data)

    # 클라이언트 소켓 종료
    client_socket.close()

클라이언트 (client.py):

import socket
import json

# 클라이언트 소켓 생성
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 서버 주소와 포트 설정
server_address = ('localhost', 8080)
client_socket.connect(server_address)

# JSON 객체 생성
data = {"name": "John", "age": 30, "city": "New York"}

# JSON 객체를 문자열로 변환
json_data = json.dumps(data)

# 데이터 전송
client_socket.send(json_data.encode())
print('Sent:', json_data)

# 데이터 수신
received_data = client_socket.recv(1024).decode()
print('Received:', received_data)

# 수신한 데이터를 JSON 객체로 변환
json_received_data = json.loads(received_data)
print('JSON:', json_received_data)

# 클라이언트 소켓 종료
client_socket.close()

위 예제 코드를 실행하면 클라이언트가 서버에 JSON 데이터를 전송하고, 서버는 JSON 데이터를 수신한 후 다시 클라이언트에 응답을 전송합니다.

이처럼, JSON과 소켓을 함께 사용하면 프로그램 간에 데이터를 효율적으로 주고받을 수 있습니다. 이를 활용하여 네트워크 기반 애플리케이션을 개발할 수 있습니다.