관리 메뉴

코딩하는 락커

2. 어플리케이션 계층 2 본문

🌐 네트워크

2. 어플리케이션 계층 2

락꿈사 2022. 3. 28. 14:18

2.7 소켓 프로그래밍 : 네트워크 어플리케이션 생성

  • 일반적인 네트워크 애플리케이션은 2개의 서로 다른 종단 시스템에 존재하는 클라이언트 프로그램과 서버 프로그램으로 구성됨
  • 이들 두 프로그램을 수행하면 클라이언트와 서버 프로세스가 생생됨
  • 두 프로세스가 소켓으로 읽고(Read), 소켓에 쓰기(Write)를 통해서 서로 통신함
  • 개발 단계 동안 개발자가 우선해야 할 결정 중 하나는 그 애플리케이션이 TCP를 이용하는지, UDP를 이용하는지에 대한 것임
  • TCP: 연결지향성 서비스이고 신뢰적 바이트 스트림 채널을 제공하며 이 채널을 통해 데이터가 두 종단 시스템 사이를 흐르게 함
  • UDP: 비연결형이고 한 종단 시스템에서 다른 곳으로 데이터를 독립적인 패킷으로 만들어서 보내며 전송에 대한 보장은 하지 않음
  • TCP 프로토콜 선택시 TCP Socket을 사용하고 UDP 프로토콜 선택시 UDP Socekt을 사용함
  • TCP Socket: Socket Stream이라고 불림
  • UDP Socket: Socket Datagram

 

UDP 소켓 프로그래밍

  • UDP를 이용한 클라이언트-서버 어플리케이션
서버 클라이언트
port=x 인 소켓 생성  
  소켓 생성
  serverIP와 port=x인 데이터그램 생성
  client 소켓을 통해 데이터그램 통신
serversocket으로부터 UDP 세그먼트 읽기  
serversocket에 응답하기: 클라이언트 주소, 포트번호 명시  
  clientsocket 읽기
  clientsocket 닫기

 

  • UDP_Client.py
# socket 모듈: 네트워크 통신의 기본 구성
from socket import *

# serverName 은 128.138.32.126 or cis.ploy.edu
serverName = "servername"
serverPort = 12000

# client 소켓 생성
# AF_INET : Ipv4 사용
# socket.SOCK_DGRAM: UDP 소켓
clientSocket = socket(socket.AF_INET, socket.SOCK_DGRAM)

# 키보드 입력을 통해 message 입력
message = raw_input('Input lawercase sentence:')

# 목적지 호스트로 전송
clientSocket.sendto(message, (serverName, serverPort))

# 패킷을 보낸 후 서버로부터 데이터 수신 기다리기
# modifiedMessage: 패킷 데이터
# severAddress: 서버 IP 주소, 서버 포트번호 
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)
print(modifiedMessage)
clientSocket.close()

 

  • UDP_Server.py
# socket 모듈: 네트워크 통신의 기본 구성
from socket import *

# serverPort에 12000 할당
serverPort = 12000

# server 소켓 생성
# AF_INET : Ipv4 사용
# socket.SOCK_DGRAM: UDP 소켓
serverSocket = socket(socket.AF_INET, socket.SOCK_DGRAM)

# 포트번호 12000을 서버의 소켓에 할당
serverSocket.bind(('', serverPort))

print("The server is ready to receive")

# 클라이언트로부터 계속해서 패킷을 수신하고 처리할 수 있도록 while 루프 사용
while True:
    # message: 패킷 데이터
    # clientAddress: 패킷의 소스 주소 (클라이언트의 IP와 포트번호)
    message, clientAddress = serverSocket.recvfrom(2048)
    # 클라이언트로부터 받은 메시지를 대문자로 변환
    modifiedMessage = message.decode().upper()
    # 클라이언언트의 주소와 변환된 메시지를 패킷으로 만들어 서버의 소켓에 보냄
    serverSocket.sendto(modifiedMessage, clientAddress)

 

TCP 소켓 프로그래밍

  • TCP를 이용한 클라이언트-서버 어플리케이션
서버  클라이언트
port=x인 소켓 생성  
입력 연결 요청 대기  
  serverIP, port=x에 연결되는 소켓 생성
  clientSocekt을 이용해서 요청 보내기
connectionSocket에서 요청 읽기  
connectionSocket에서 응답 쓰기  
  clientSocekt에서 응답 읽기
connectionSocket닫기 clientSocekt닫기
   

 

  • TCP_Client.py
# socket 모듈: 네트워크 통신의 기본 구성
from socket import *

# serverName 은 128.138.32.126 or cis.ploy.edu
serverName = "servername"
serverPort = 12000

# client 소켓 생성
# AF_INET : Ipv4 사용
# socket.SOCK_DGRAM: TCP 소켓
clientSocket = socket(socket.AF_INET, socket.SOCK_STREAM)

# 클라이언트가 TCP 소켓을 이용하여 서버로 데이터를 보내기 전에 TCP연결이 먼저 클라이언트와 서버 사이에 설정되어야 함
# 클라이언트와 서버 간의 TCP 연결을 설정함
clientSocket.connect((serverName, serverPort))

# 키보드 입력을 통해 sentence 입력
sentence = raw_input('Input lawercase sentence:')

# setence에 있는 바이트를 클라이언트 소켓을 통해 TCP 연결로 보냄
clientSocket.send(sentence.encode())

# 패킷을 보낸 후 서버로부터 데이터 수신 기다리기
# modifiedMessage: 패킷 데이터
# severAddress: 서버 IP 주소, 서버 포트번호 
modifiedMessage, serverAddress = clientSocket.recvfrom(1024)
print(modifiedMessage)
clientSocket.close()

 

  • TCP_Server.py
# socket 모듈: 네트워크 통신의 기본 구성
from socket import *

# serverPort에 12000 할당
serverPort = 12000

# server 소켓 생성
# AF_INET : Ipv4 사용
# socket.SOCK_DGRAM: TCP 소켓
serverSocket = socket(socket.AF_INET, socket.SOCK_STREAM)

# 포트번호 12000을 서버의 소켓에 할당
# 출입문을 설정하고 임의의 클라이언트가 문을 두드리기를 기다림
serverSocket.bind(('', serverPort))

# 서버가 클라이언트로부터 TCP 연결 요청을 듣도록 함
# 연결의 최대 수를 1로 설정
serverSocket.listen(1)

print("The server is ready to receive")

# 클라이언트로부터 계속해서 패킷을 수신하고 처리할 수 있도록 while 루프 사용
while True:

    # 클라이언트가 문을 두드리면 클라이언트에게 지정된 connectionSocekt이라는 새로운 소켓을 서버에 생성함
    connectionSocket, addr = serverSocket.accept()

    # sentence: 패킷 데이터
    setence = connectionSocket.recv(1024).decode()

    # 클라이언트로부터 받은 메시지를 대문자로 변환
    capitalizedSentence = setence.upper()

    # 클라이언언트의 주소와 변환된 메시지를 패킷으로 만들어 서버의 소켓에 보냄
    serverSocket.send(capitalizedSentence.encode())
    connectionSocket.close()

'🌐 네트워크' 카테고리의 다른 글

3. 전송 계층 3  (0) 2022.03.29
3. 전송 계층 2  (0) 2022.03.28
3. 전송 계층 1  (0) 2022.03.28
2. 어플리케이션 계층 1  (0) 2022.03.23
1. 컴퓨터 네트워크 기본  (0) 2022.03.23
Comments