
1. Socket Programming 개요

애플리케이션 프로세스와 종단 간 전송 프로토콜(End-to-End Transport Protocol) 사이의 문 역할 (연결 담당)
1) Client : 키보드로 문자열(예: "abc")을 입력
(→ 서버로 전송)
2) Server : 수신한 문자열을 대문자(Uppercase) 로 변환
(ex. "abc" → "ABC")
3) Server : 변환된 데이터를 다시 클라이언트에게 전송
4) Client : 변환된 데이터를 받아 화면에 출력 (결과: "ABC")
2. UDP
UDP는 unreliable(신뢰성 없음) 데이터그램(datatgram) 단위 전송 제공
빠르고 간단하지만, 데이터가 손실되거나 순서가 꼬일 수 있다는 것을 감수해야 함

1-a) Server : UDP 소켓 생성
serverSocket = socket(AF_INET, SOCK_DGRAM)
1-b) Client : UDP 소켓 생성
clientSocket = socket(AF_INET, SOCK_DGRAM)
2) Client : datagram 보내기
서버의 IP와 Port를 넣어 데이터그램을 clientSocket으로 전송
3) Server : datagram 읽기
serverSocket에서 클라이언트가 보낸 데이터그램(datagram)을 읽음
4) Server : 응답 적고 보내기
클라이언트의 주소(IP, Port)를 보고 serverSocket을 통해 응답 전송
5) Client : 응답 수신
서버로부터 응답을 clientSocket으로 읽음
6) Client : clientSocket 닫기
from socket import *
#1. 서버 주소와 포트 설정
serverName = '<hostname>'
serverPort = 12000
#2. 클라이언트 소켓 생성
clientSocket = socket(AF_INET, SOCK_DGRAM)
#3. 사용자 입력 받기
message = input('Input lowercase sentence:')
#4. 서버로 메시지 전송
clientSocket.sendto(message.encode(), (serverName, serverPort))
#5. 서버로부터 응답 수신
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)
print(modifiedMessage.decode()) #6. 응답 출력
clientSocket.close() #7. 소켓 종료
from socket import *
#1. 포트 번호 설정
serverPort = 12000
#2. 서버 소켓 생성 및 바인딩
serverSocket = socket(AF_INET, SOCK_DGRAM)
serverSocket.bind(('', serverPort))
#3. 준비 메시지 출력
print("The server is ready to receive")
#4. 데이터 처리
while True:
message, clientAddress = serverSocket.recvfrom(2048)
modifiedMessage = message.decode().upper()
serverSocket.sendto(modifiedMessage.encode(), clientAddress)
3. TCP
1) Server : 연결 요청 받을 소켓 미리 만들기
(서버 프로세스가 먼저 실행 중이어야 함)
2) Client : 서버에 먼저 접촉
(TCP 소켓 생성, 서버의 IP 주소와 포트 번호를 이용해 연결 요청 보냄)
3) Server : 새로운 소켓 생성
클라이언트 연결이 오면, 서버는 새로운 소켓을 만들어서 각각의 클라이언트와 통신함

1-a) Server : TCP 소켓 생성 및 포트 바인딩
SOCK_STREAM : TCP용 소켓
1-b) Client : TCP 소켓 생성
클라이언트도 TCP용 소켓을 생성
2) Client : 서버에 연결 요청
서버 IP와 포트로 TCP 연결(connect) 요청
3) Server : 연결 요청 수락
4) Client : 데이터 전송
message를 서버로 전송
5) Server : 데이터 수신
클라이언트로부터 데이터 수신
6) Server : 응답 적고, 전송
7) Client : 응답 수신
8) Client : 연결 종료
from socket import *
#1. 서버 이름과 포트 번호 설정
serverName = 'server주소나 IP'
serverPort = 12000
#2. 클라이언트 소켓 생성 및 서버에 연결
clientSocket = socket(AF_INET, SOCK_STREAM)
clientSocket.connect((serverName, serverPort))
#3. 사용자 입력 데이터 전송
sentence = input('Input lowercase sentence: ')
clientSocket.send(sentence.encode())
#4. 서버로부터 응답 받고 출력
modifiedSentence = clientSocket.recv(1024)
print('From Server:', modifiedSentence.decode())
#5. 소켓 닫기
clientSocket.close()
from socket import *
#1. 포트 번호 설정
serverPort = 12000
#2. 서버 소켓 생성 및 바인딩
serverSocket = socket(AF_INET, SOCK_STREAM)
serverSocket.bind(('', serverPort))
#3. 클라이언트 접속 대기 시작
serverSocket.listen(1)
print("The server is ready to receive")
#4. 데이터 처리
while True:
connectionSocket, addr = serverSocket.accept()
sentence = connectionSocket.recv(1024).decode()
capitalizedSentence = sentence.upper()
connectionSocket.send(capitalizedSentence.encode())
connectionSocket.close()