소켓 프로그래밍
- 클라이언트/서버 애플리케이션을 어떻게 빌드할 것인가에 대한 얘기
- 두 개의 소켓 타입
- UDP : 신뢰할 수 없는 데이터그램
- TCP : 믿을 수 있는, 바이트 전송 지향성(위에서 내려온 경계에 관심이 없고 바로바로 메시지를 전송하는 거야)
애플리케이션 예시
- 클라이언트는 키보드로부터 사용자가 치는 라인 커멘드를 읽고 이 문장을 서버에 보내야 한다
- 서버는 해당 문장을 받아서 모두 대문자로 바꾼 후에 클라이언트에게 보내준다.
- 클라이언트는 데이터를 받아서 스크린에 투영한다.
이 작업을 수행하는 클라이언트 측의 프로그램과 서버의 코딩을 파이썬으로 구현해보자
UDP를 사용할 경우, UDP는 연결의 개념이 없다. 영어로는 아래와 같이 말한다.
"no handshaking begore sending data"
따라서 sender는 명확하게 IP주소를 보내야 한다. 그래야지 목적지까지 패킷이 찾아갈 수 있어
reciever는 받은 패킷으로부터 senderd의 IP address와 포트 넘버를 추출해내서 응답할 때 사용해야 해. (커낵션이 따로 없으니까.)
Server |
Client |
create socket, port = x: serverSocket = socket(AF_INETSOCK_DGRAM)
read datagram from serverSocket #그다음에 리플라이를 보내는과정 대문자로 바꾼다음에
write reply to serverSocket specifying client address, port number |
creat socket: clientSocket = socket(AF_INET,SOCK_DGRAM)
이제 아래로 내려 보내면,
Create datagram with serverIP address And port = x; send datagram via clientSocket
이제 서버로 보내는거야.
|
#Python UDPClient
from socket import
serverName = 'hostname' # IPadrress
serverPort = 12000
clientSocket = socket(AF_INET, SOCK_DGRAM)
message = raw_input('input lowercase sentence:)
clientSocket.sendto(message.encode(), (serverName, severPort))
modifiedMessage, severAddress = clientSocket.recvfrome(2048)
print modifiedMessage.decode()
clientSocket.close()
#UDP 서버 부분
from socket import
severPort = 12000
severSocket = socket(AF_INET, SOCK_DGRAM)
severSocket.bind((",serverPort))
print("The sever is ready to recieve")
while True:
message, clientAddress = severSocket.recvfrome(2048)
modifiedMessage = message.decode().upper()
serverSocket.sendto(mdifiedMessage.encode() clientAddress())
Socket programming with TCP
서버 소켓이 항상 클라이언트의 요청에 따른 welcome socket을 가지고 있어
seve |
client |
create socket, port =x, for incoming request: severSocket =socket()
wait for incoming connetion request connetionSocket = severScoket.accept() |
create socket, connet to hostid, prot = x clientSocket = socket()
sen |
#TCP client
from socket import
severName = 'severname'
severPort = 12000
clentSocket = socket(AF _INET, SOCK_STREAM)
clientSocket.connet((severName,severPort))
sentence = reaw_input('Input lowercase sentence:')
clientSocket.send(sentence.encode())
modifiedSEntence = clientSocket.recv(1024)
print('From Sever:' ~~
#TCP sever
from socket import
severPort = 12000
clentSocket = socket(AF _INET, SOCK_STREAM)
severSocket.bind(('',severPort))
severSocket.listen(1)
print 'The sever is ready to receive'
while True:
connetionSocket, addr = severSocket.accept()
sentence = connectionSocket.recv(10244).decode()
capitalizedSentence = sentence.upper()
connetionSocket.send(capitalizedSentence.encode())
#누구에게 갈 소켓인지 정해져있기 때문에 어드레스를 따로 지정 하지 않아줘도 된다.
그 이후에 커낵션을 끊어주면 된다.