Socket_1


Socket_1: 문자열을 아스키코드로 변환하는 소켓 프로그래밍


프로그램 설명

이 프로그램은 TCP 소켓을 이용하여 클라이언트가 전송한 문자열을 서버가 받아, 해당 문자열을 아스키코드 리스트로 변환한 뒤, 다시 클라이언트에게 전송하는 방식으로 작동한다.
양방향 통신은 문자열 기반이며, 서버는 수신한 문자열을 각 문자마다 ord()를 통해 아스키 코드로 바꾼다.

  • 통신 방식: TCP
  • 인코딩 방식: UTF-8
  • 통신 구조: 서버 1개, 클라이언트 1개 (단일 연결)

소스 프로그램

1) ascii_server.py (서버)

import socket

HOST = '127.0.0.1'
PORT = 65432

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    print(f"[서버] 연결 대기 중... (포트: {PORT})")
    
    conn, addr = s.accept()
    with conn:
        print(f"[서버] 연결됨: {addr}")
        while True:
            data = conn.recv(1024).decode()
            if not data:
                break
            print(f"[서버] 받은 문자열: {data}")
            
            ascii_codes = [str(ord(c)) for c in data]
            result = ','.join(ascii_codes)
            print(f"[서버] 아스키코드로 변환: {result}")
            
            conn.sendall(result.encode())

2) ascii_client.py (클라이언트)

import socket

HOST = '127.0.0.1'
PORT = 65432

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    while True:
        msg = input("보낼 문자열 입력 (종료: 엔터): ")
        if msg == '':
            break
        s.sendall(msg.encode())
        
        data = s.recv(1024).decode()
        print(f"[클라이언트] 받은 아스키코드: {data}")

입력 내용

클라이언트 입력 (직접 입력):

보낼 문자열 입력 (종료: 엔터): hello

출력 내용 + 입력 내용

서버 측 출력:

클라이언트 측 출력:


실행 방법 요약

  1. ascii_server.py 먼저 실행
  2. VSCode에서 터미널 분할 또는 새 창 열기
  3. ascii_client.py 실행
  4. 클라이언트에서 문자열 입력 시, 서버가 아스키 코드로 변환하여 응답

서버 코드 설명 (ascii_server.py)

이 코드는 클라이언트로부터 문자열을 받아, 해당 문자열을 아스키코드로 변환한 후 클라이언트에게 다시 전송하는 TCP 서버 프로그램이다.

import socket
  • 소켓 프로그래밍을 위해 socket 모듈을 불러온다.
HOST = '127.0.0.1'
PORT = 65432
  • HOST는 서버 IP 주소로, 현재 컴퓨터를 의미하는 127.0.0.1을 사용한다.
  • PORT는 통신에 사용할 포트 번호로, 일반적으로 1024 이상의 값을 사용한다.
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
  • TCP 통신을 위한 소켓 객체를 생성한다. AF_INET은 IPv4, SOCK_STREAM은 TCP를 의미한다.
  • with 문을 사용함으로써 소켓 사용이 끝나면 자동으로 닫히도록 한다.
    s.bind((HOST, PORT))
    s.listen()
  • bind()를 통해 소켓을 지정한 IP 주소와 포트 번호에 바인딩한다.
  • listen()을 호출하여 클라이언트의 접속 요청을 대기 상태로 만든다.
    conn, addr = s.accept()
  • 클라이언트의 연결 요청이 들어오면 이를 수락하고, 연결 소켓 conn과 클라이언트 주소 addr을 반환한다.
    with conn:
        while True:
            data = conn.recv(1024).decode()
  • conn.recv()를 통해 클라이언트로부터 데이터를 수신한다. 최대 1024바이트까지 받으며, 받은 데이터는 문자열로 디코딩한다.
            if not data:
                break
  • 수신된 데이터가 없으면 연결이 종료되었음을 의미하므로 반복문을 종료한다.
            ascii_codes = [str(ord(c)) for c in data]
            result = ','.join(ascii_codes)
  • 수신한 문자열의 각 문자를 ord() 함수를 이용하여 아스키 코드로 변환한다.
  • 변환된 숫자들을 문자열로 바꾼 뒤, 쉼표로 연결하여 하나의 문자열로 만든다.
            conn.sendall(result.encode())
  • 변환된 아스키코드 문자열을 클라이언트에게 전송한다.

클라이언트 코드 설명 (ascii_client.py)

이 코드는 사용자가 입력한 문자열을 서버로 전송하고, 서버로부터 변환된 아스키코드 문자열을 수신하여 출력하는 TCP 클라이언트 프로그램이다.

import socket
  • 소켓 모듈을 불러온다.
HOST = '127.0.0.1'
PORT = 65432
  • 서버의 IP 주소와 포트 번호를 설정한다. 서버와 동일한 값으로 지정해야 연결된다.
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
  • TCP 소켓을 생성하고 서버에 연결한다.
    while True:
        msg = input("보낼 문자열 입력 (종료: 엔터): ")
        if msg == '':
            break
  • 사용자로부터 문자열을 입력받는다. 아무 것도 입력하지 않고 엔터를 누르면 반복문을 종료하고 프로그램을 종료한다.
        s.sendall(msg.encode())
  • 입력받은 문자열을 UTF-8로 인코딩하여 서버에 전송한다.
        data = s.recv(1024).decode()
        print(f"[클라이언트] 받은 아스키코드: {data}")
  • 서버로부터 응답을 받아 디코딩한 후 출력한다.

Read more

네트워크_Mobility

Mobility란? Mobility(이동성)은 네트워크에서 기기가 네트워크 위치(IP 주소 등)가 바뀌더라도 지속적으로 연결을 유지할 수 있는 능력을 말합니다. Mobility를 처리하는 두 가지 접근 방식 1. Routing이 Mobility를 처리하게 한다 (Network-based mobility) * 개념: 이동하는 호스트의 현재 위치를 네트워크가 추적하고, 그에 따라 패킷 경로를 동적으로 수정함 * 예시: Mobile IP * 홈

By Youn