본문 바로가기
Python/파이썬 문법

(Python) JSON 데이터 통신 (서버/클라이언트)

by 미니몬 2024. 1. 11.

목차

    728x90
    반응형

    Summary

    오늘은 Python 코드를 사용해서 JSON 데이터를 어떻게 주고받을 수 있는지 알아보겠습니다.

    JSON(JavaScript Object Notation)은 데이터 교환을 위한 경량의 포맷입니다. 이는 사람이 읽기 쉬운 텍스트를 기반으로 하여 키-값 쌍으로 구성됩니다. JSON은 서버와 클라이언트 간 데이터 전송에 널리 사용되며, 다양한 프로그래밍 언어에서 쉽게 파싱하여 데이터의 가시성을 높혀주었습니다. 간단한 서버-클라이언트 구조를 만들어서 진행해보도록 하겠습니다.

     

     

    1) 서버와 클라이언트

    • 서버(Server) : 서버는 특정 IP 주소와 포트 번호를 열어 대기하고, 클라이언트의 연결 요청을 기다립니다.
      연결 후 클라이언트로부터 요청을 처리하며 응답을 반환하는 역할을 합니다.
    • 클라이언트(Client) : 클라이언트는 서버에 연결하고 요청을 보내며 서버로부터 응답을 받습니다. 클라이언트는 서버의 IP 주소와 포트 번호를 사용하여 서버에 연결합니다.

    즉, 서버(Server)는 서비스를 제공하는 입장이며, 클라이언트(Client)는 서버에게 필요한 서비스를 응답받는 입장입니다.

     

     

    2) JSON이란?

    • 형식 : JSON(JavaScript Object Notation)은 데이터를 저장하거나 교환할 때 사용하는 경량의 포맷입니다. 
      ex) '{"name": "John", "age": 30}' 와 같이 키-값 쌍으로 사용합니다.

    • 가독성 : 사람이 읽기 쉽고, 기계가 분석하고 생성하기에도 적합합니다.

    • JSON은 간결하고 유연한 데이터 형식으로, 웹 API, 설정 파일, 데이터 교환 등 다양한 분야에서 널리 사용됩니다.
      그러나 보안과 데이터 크기 관련 고려사항을 유념해야 합니다.

    JSON 데이터의 자세한 내용은 아래 링크를 확인해주세요.

    [바로가기] - [Python/파이썬 문법] - (Python) JSON 모듈이란?

     

     

    3) 서버 코드

    서버는 클라이언트의 연결을 기다리고, 연결되면 JSON 객체를 수신한 뒤 이를 처리하여 응답을 보냅니다.

    import socket
    import json
    
    def start_server(host='0.0.0.0', port=12345):
        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
            s.bind((host, port))
            s.listen()
            print(f"Server is listening on {host}:{port}")
    
            while True:  # 서버를 계속 실행 상태로 유지
                conn, addr = s.accept()
                with conn:
                    print(f"Connected by {addr}")
                    while True:
                        data = conn.recv(1024)
                        if not data:
                            break  # 데이터가 없으면 클라이언트 연결 종료
    
                        # JSON 데이터를 수신하고 처리
                        received_json = json.loads(data.decode())
                        print(f"Received data: {received_json}")
    
                        # 응답을 JSON 형태로 전송
                        response = {"status": "success", "message": "Data received"}
                        conn.sendall(json.dumps(response).encode())
    
                # 한 클라이언트의 연결이 종료된 후 다음 연결을 기다림
                print(f"Connection with {addr} ended")
    
    if __name__ == "__main__":
        start_server()

     

    코드의 간단한 구조는 아래와 같습니다.

     1) socket 바인딩/대기

     2) 연결 무한 대기

     3) received_json 변수에 클라이언트에게 받은 JSON 데이터를 Load

     4) 응답 JSON 데이터 전송

     

     

    4) 클라이언트 코드

    클라이언트는 서버에 연결하여 JSON 객체를 전송하고 서버로부터 JSON 객체의 응답을 받아옵니다.

    import socket
    import json
    
    host = 'X.X.X.X' #str
    port = 12345   #int
    
    def start_client(server_host=host, server_port=port):
        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
            s.connect((server_host, server_port))
    
            # JSON 데이터 전송
            data_to_send = {"type": "greeting", "content": "Hello, server!"}
            s.sendall(json.dumps(data_to_send).encode())
    
            # 서버로부터 응답 수신
            data = s.recv(1024)
            print(f"Received response: {data.decode()}")
    
    if __name__ == "__main__":
        start_client()

     

    코드의 간단한 구조는 아래와 같습니다.

     1) 서버 socket 연결

     2) 서버로 JSON 데이터 전송

     3) 응답 수신

     

    5) 사용방법

    1. 서버/클라이언트간 통신할 IP주소와 Port 번호를 알맞게 수정합니다
    2. 먼저 서버 코드를 실행하여 클라이언트의 연결을 기다립니다
    3. 후 클라이언트 코드를 실행하고. JSON 데이터를 전송하고 응답을 기다립니다

     

    이 예제는 TCP/IP 프로토콜을 사용합니다. TCP/I는 인터넷에서 데이터를 전송하는데 사용되는 표준 프로토콜입니다.

    데이터를 전송할 시 중요한 정보의 경우 SSL/TLS 와 같은 기술을 사용하여 데이터를 암호화 하는 과정이 필요합니다.

    네트워크 오류가 발생할 수 있으므로 그에 따른 적절한 오류 처리 로직을 구현하는 것도 중요합니다.

    728x90
    반응형