네트워크

파이썬으로 소켓프로그래밍 구현

창민이 개발일지 2022. 6. 22. 13:58

UDP

  • User Datagram Protocol
  • 데이터그램: 비연결 지향형
  • SOCK_DGRAM

UDP 메소드

  • recvfrom(int length): byte의 길이 만큼 다른 소켓에서 보낸 값을 받아온다.(하지만 length의 길이 만큼 가져온다는 보장은 없다.)
  • sendto(byte[] packet, clientAddress): 해당 주소를 가진 client에게 byte[]을 보낸다.

 

Client Socket

from socket import socket

host = "192.168.1.112" # 접속할 호스트 IP
port = 12000 # 접속할 프로세스 port

clientSocket = socket(AF_INET, SOCK_DGRAM)
try:
    message = input("Input lowercase sentence:")
    clientSocket.sendto(message.encode(),(host,port)) # UTF-8로 encoding해서 보내주어야 된다.
    
    modifiedMessage, serverAddress = clientSocket.recvfrom(2048)
    print(modifiedMessage.decode())


except Exception as e:
    print("Error: ",e)
    clientSocket.close()

clientSocket.close()

Server Socket

from socket import socket

host = "192.168.1.112" # 서버 IP
port = 12000 # Client가 접속할 서버 내 프로세스 포트번호

serverSocket = socket(AF_INET, SOCK_DGRAM)
try:
    serverSockefrt.bind((host, port)) # 소켓의 host와 port를 지정해준다.
    print("The server is ready to receive")

    while True:
        message, clientAddress = serverSocket.recvfrom(2048)
        modifiedMessage = message.decode().upper()
        serverSocket.sendto(modifiedMessage.encode(),clientAddress)
        
        if(message.decode() == "close"):
            break
              
    print(message.decode())
except Exception as e:
    print("Error: ",e)
    
serverSocket.close()

 

TCP

  • Transmission Control Protocol
  • 스트림: 연결 지향형
  • SOCK_STREAM

TCP 메소드

  • bind(String host, int port): 
    • 통신을 하기 위해서는 통신 기기간(여기서는 컴퓨터) 데이터가 어디에서 오고 어디로 가는지를 알아야 한다.
    • 이렇게 하기 위해 host와 port를 바인드(묶어주기) 해주어야 한다. 
  • recv(int length): byte의 길이 만큼 다른 소켓에서 보낸 값을 받아온다.(recvfrom처럼 address를 지정할 수 없기 때문에 미리 소켓끼리 연결해 주어야 한다.)
  • send(byte[] packet, clientAddress): 해당 주소를 가진 client에게 byte[]을 보낸다.
  • listen(int number): 
    • 클라이언트들이 접근을 할때 수신 대기열을 만들어서 몇개의 클라이언트를 대기 시킬지 설정.
  • accpet(): 클라이언트의 연결을 기달린다.

Client Socket

from socket import socket

host = "192.168.1.112"
port = 12000

clientSocket = socket(AF_INET,SOCK_STREAM)
try:
    clientSocket = socket(AF_INET,SOCK_STREAM)
    clientSocket.connect((host,port))
    message = input("Input lowercase sentence:")
    clientSocket.send(message.encode())
    modifiedSentence = clientSocket.recv(1024)
    print("From Server:", modifiedMessage.decode())
except Exception as e:
    print("Error:",e)
clientSocket.close()

Server Socket

from socket import socket

host = "192.168.1.112" # 서버 IP
port = 12000 # Client가 접속할 서버 내 프로세스 포트번호

serverSocket = socket(AF_INET,SOCK_STREAM)
try:
    serverSocket.bind((host,port))
    serverSocket.listen(1)
    print("The server is ready to receive")
    while True:
        clientSocket, addr = serverSocket.accept()
        message = clientSocket.recv(1024).decode()
        print(message)
        if(message == "close"):
            clientSocket.close()
            break
        clientSocket.send(message.encode())
        clientSocket.close()
except Exception as e:
    print("Error:",e)
serverSocket.close()