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
출력 내용 + 입력 내용
서버 측 출력:

클라이언트 측 출력:

실행 방법 요약
ascii_server.py먼저 실행- VSCode에서 터미널 분할 또는 새 창 열기
ascii_client.py실행- 클라이언트에서 문자열 입력 시, 서버가 아스키 코드로 변환하여 응답
서버 코드 설명 (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}")
- 서버로부터 응답을 받아 디코딩한 후 출력한다.