본문 바로가기
네트워크 프로그래밍

[네트워크 프로그래밍] Week 2: 소켓 프로그래밍 기초 및 고급 소켓 옵션

by cogito21_python 2024. 6. 4.
반응형

소켓 프로그래밍 기초 및 고급 소켓 옵션

Day 1: 소켓 프로그래밍 기초

 

강의 내용:

  1. 소켓의 개념과 역할
    • 소켓의 정의와 역할
    • 소켓 통신의 기본 구조
  2. 소켓 타입과 프로토콜
    • 스트림 소켓 (TCP)
    • 데이터그램 소켓 (UDP)
    • 원시 소켓 (Raw Socket)
  3. 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: 고급 소켓 옵션

강의 내용:

  1. 소켓 옵션 설정
    • setsockopt()와 getsockopt() 사용법
    • 중요한 소켓 옵션 (SO_REUSEADDR, SO_LINGER, SO_RCVBUF, SO_SNDBUF)
  2. 비차단 모드와 타임아웃 설정
    • 비차단 모드 (setblocking(False))
    • 소켓 타임아웃 설정 (settimeout())
  3. 소켓 멀티플렉싱
    • 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 서버와 클라이언트 구현

강의 내용:

  1. TCP 서버와 클라이언트 구조
    • TCP 서버와 클라이언트의 역할
    • 연결 설정 및 데이터 전송 과정
  2. TCP 서버 구현
    • 서버 소켓 생성 및 설정
    • 클라이언트 연결 대기 및 처리
  3. 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 서버와 클라이언트 구현

강의 내용:

  1. UDP 서버와 클라이언트 구조
    • UDP 서버와 클라이언트의 역할
    • 데이터그램 통신의 특징과 장단점
  2. UDP 서버 구현
    • 서버 소켓 생성 및 설정
    • 데이터그램 수신 및 송신
  3. 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: 고급 소켓 프로그래밍

강의 내용:

  1. 소켓 멀티플렉싱 및 비동기 처리
    • select() 함수 사용법
    • 비동기 소켓 프로그래밍
  2. 소켓의 비차단 모드 활용
    • 비차단 모드 소켓 설정
    • 비차단 모드의 장단점
  3. 고급 소켓 옵션 활용
    • 소켓 옵션 설정 (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. 프로젝트 계획 수립
    • 프로젝트 목표 및 요구사항 정의
    • 프로젝트 타임라인 설정
    • 프로젝트 도구 및 환경 설정

실습:

  • 프로젝트 계획서 작성 및 공유
### 실습: 프로젝트 계획서 작성
1. 프로젝트 목표 정의
2. 기능 명세서 작성
3. 개발 일정 및 마일스톤 설정
4. 역할 분담 및 작업 계획 수립
5. GitHub 저장소 생성 및 초기화

 

이 강의는 소켓 프로그래밍의 기초부터 고급 소켓 옵션까지 다루며, 실습을 통해 이론을 실제로 적용해보고 네트워크 프로그래밍의 핵심 기술을 습득하는 것을 목표로 합니다. 각 주제별로 실습 예제를 통해 개념을 명확히 이해하고 실제 코드를 작성해보는 기회를 제공합니다.

반응형