반응형
소켓 프로그래밍 기초 및 고급 소켓 옵션
Day 1: 소켓 프로그래밍 기초
강의 내용:
- 소켓의 개념과 역할
- 소켓의 정의와 역할
- 소켓 통신의 기본 구조
- 소켓 타입과 프로토콜
- 스트림 소켓 (TCP)
- 데이터그램 소켓 (UDP)
- 원시 소켓 (Raw Socket)
- Python 소켓 라이브러리
- 소켓 생성 (socket.socket())
- 소켓 바인딩 (bind())
- 소켓 청취 (listen())
- 소켓 연결 (accept())
실습:
- 기본 소켓 프로그래밍 예제
# TCP 서버
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 12345))
server_socket.listen(5)
print("TCP 서버가 포트 12345에서 대기 중입니다.")
client_socket, addr = server_socket.accept()
print(f"{addr}와 연결되었습니다.")
data = client_socket.recv(1024)
print(f"받은 데이터: {data.decode()}")
client_socket.sendall(data)
client_socket.close()
server_socket.close()
# TCP 클라이언트
import socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 12345))
client_socket.sendall(b"Hello, Server!")
data = client_socket.recv(1024)
print(f"서버로부터 받은 데이터: {data.decode()}")
client_socket.close()
Day 2: 고급 소켓 옵션
강의 내용:
- 소켓 옵션 설정
- setsockopt()와 getsockopt() 사용법
- 중요한 소켓 옵션 (SO_REUSEADDR, SO_LINGER, SO_RCVBUF, SO_SNDBUF)
- 비차단 모드와 타임아웃 설정
- 비차단 모드 (setblocking(False))
- 소켓 타임아웃 설정 (settimeout())
- 소켓 멀티플렉싱
- select() 함수 사용법
- 소켓 멀티플렉싱을 통한 동시성 처리
실습:
- 고급 소켓 옵션 설정 및 활용 예제
# 소켓 옵션 설정 예제
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind(('localhost', 12345))
server_socket.listen(5)
server_socket.settimeout(5)
try:
client_socket, addr = server_socket.accept()
print(f"{addr}와 연결되었습니다.")
except socket.timeout:
print("연결 대기 시간 초과")
server_socket.close()
# 비차단 모드 소켓 예제
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind(('localhost', 12345))
server_socket.listen(5)
server_socket.setblocking(False)
try:
client_socket, addr = server_socket.accept()
print(f"{addr}와 연결되었습니다.")
data = client_socket.recv(1024)
print(f"받은 데이터: {data.decode()}")
client_socket.close()
except BlockingIOError:
print("연결 대기 중...")
server_socket.close()
Day 3: 간단한 TCP 서버와 클라이언트 구현
강의 내용:
- TCP 서버와 클라이언트 구조
- TCP 서버와 클라이언트의 역할
- 연결 설정 및 데이터 전송 과정
- TCP 서버 구현
- 서버 소켓 생성 및 설정
- 클라이언트 연결 대기 및 처리
- TCP 클라이언트 구현
- 클라이언트 소켓 생성 및 설정
- 서버 연결 및 데이터 전송
실습:
- 완전한 TCP 서버와 클라이언트 구현
# TCP 서버
import socket
def start_tcp_server():
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 12345))
server_socket.listen(5)
print("TCP 서버가 포트 12345에서 대기 중입니다.")
while True:
client_socket, addr = server_socket.accept()
print(f"{addr}와 연결되었습니다.")
data = client_socket.recv(1024)
print(f"받은 데이터: {data.decode()}")
client_socket.sendall(data)
client_socket.close()
if __name__ == "__main__":
start_tcp_server()
# TCP 클라이언트
import socket
def start_tcp_client():
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 12345))
client_socket.sendall(b"Hello, Server!")
data = client_socket.recv(1024)
print(f"서버로부터 받은 데이터: {data.decode()}")
client_socket.close()
if __name__ == "__main__":
start_tcp_client()
Day 4: 간단한 UDP 서버와 클라이언트 구현
강의 내용:
- UDP 서버와 클라이언트 구조
- UDP 서버와 클라이언트의 역할
- 데이터그램 통신의 특징과 장단점
- UDP 서버 구현
- 서버 소켓 생성 및 설정
- 데이터그램 수신 및 송신
- UDP 클라이언트 구현
- 클라이언트 소켓 생성 및 설정
- 서버로 데이터그램 송신 및 수신
실습:
- 완전한 UDP 서버와 클라이언트 구현
# UDP 서버
import socket
def start_udp_server():
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_socket.bind(('localhost', 12345))
print("UDP 서버가 포트 12345에서 대기 중입니다.")
while True:
data, addr = server_socket.recvfrom(1024)
print(f"{addr}로부터 받은 데이터: {data.decode()}")
server_socket.sendto(data, addr)
if __name__ == "__main__":
start_udp_server()
# UDP 클라이언트
import socket
def start_udp_client():
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
message = b"Hello, UDP Server!"
client_socket.sendto(message, ('localhost', 12345))
data, addr = client_socket.recvfrom(1024)
print(f"서버로부터 받은 데이터: {data.decode()}")
client_socket.close()
if __name__ == "__main__":
start_udp_client()
Day 5: 고급 소켓 프로그래밍
강의 내용:
- 소켓 멀티플렉싱 및 비동기 처리
- select() 함수 사용법
- 비동기 소켓 프로그래밍
- 소켓의 비차단 모드 활용
- 비차단 모드 소켓 설정
- 비차단 모드의 장단점
- 고급 소켓 옵션 활용
- 소켓 옵션 설정 (SO_REUSEADDR, SO_LINGER, SO_RCVBUF, SO_SNDBUF)
- 소켓 옵션을 이용한 성능 최적화
실습:
- 소켓 멀티플렉싱 및 비동기 소켓 프로그래밍 예제
# select()를 이용한 멀티플렉싱 예제
import select
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind(('localhost', 12345))
server_socket.listen(5)
server_socket.setblocking(False)
inputs = [server_socket]
print("멀티플렉싱 서버가 포트 12345에서 대기 중입니다.")
try:
while True:
readable, writable, exceptional = select.select(inputs, [], inputs)
for s in readable:
if s is server_socket:
client_socket, addr = server_socket.accept()
print(f"{addr}와 연결되었습니다.")
inputs.append(client_socket)
else:
data = s.recv(1024)
if data:
print(f"받은 데이터: {data.decode()}")
s.sendall(data)
else:
s.close()
inputs.remove(s)
except KeyboardInterrupt:
print("서버 종료")
finally:
server_socket.close()
Day 6: 프로젝트 준비
강의 내용:
- 프로젝트 주제 선정 및 요구사항 분석
- 네트워크 프로그래밍 프로젝트 주제 논의
- 팀 구성 및 역할 분담
- 프로젝트 계획 수립
- 프로젝트 목표 및 요구사항 정의
- 프로젝트 타임라인 설정
- 프로젝트 도구 및 환경 설정
실습:
- 프로젝트 계획서 작성 및 공유
### 실습: 프로젝트 계획서 작성
1. 프로젝트 목표 정의
2. 기능 명세서 작성
3. 개발 일정 및 마일스톤 설정
4. 역할 분담 및 작업 계획 수립
5. GitHub 저장소 생성 및 초기화
이 강의는 소켓 프로그래밍의 기초부터 고급 소켓 옵션까지 다루며, 실습을 통해 이론을 실제로 적용해보고 네트워크 프로그래밍의 핵심 기술을 습득하는 것을 목표로 합니다. 각 주제별로 실습 예제를 통해 개념을 명확히 이해하고 실제 코드를 작성해보는 기회를 제공합니다.
반응형
'-----ETC2----- > 네트워크 프로그래밍' 카테고리의 다른 글
[네트워크 프로그래밍] Week 4: 네트워크 프로토콜 심화 (UDP 및 멀티캐스트) (0) | 2024.06.04 |
---|---|
[네트워크 프로그래밍] Week 3: 네트워크 프로토콜 심화 (TCP) (0) | 2024.06.04 |
[네트워크 프로그래밍] Week 1: 네트워크 기본 개념과 TCP/IP 모델 (0) | 2024.06.03 |
[네트워크 프로그래밍] 고급 네트워크 프로그래밍 교육과정 (20주) (1) | 2024.06.03 |
[네트워크 프로그래밍] 고급 네트워크 프로그래밍 교육과정 (20주) (0) | 2024.06.02 |