만들려는 프로그램은 클라이언트가 입력한 lowercase 문장을 서버에서 uppercase로 바꿔 출력해주는 간단한 프로그램입니다.
성균관대학교 소프트웨어학과 추현승 교수님의 2021-1 네트워크 개론 수업 과제의 일부로 수행한 것입니다. 중복되는 코드 설명은 한번만 작성했습니다.
TCP
server.py
# server.py
from socket import *
# import socket package
serverPort = 12000
# set server port number as 12000
serverSocket = socket(AF_INET, SOCK_STREAM)
# create server socket with socket() method in socket package
# AF_INET means using IPv4 and SOCK_STREAM means using TCP protocol rather UDP protocol
serverSocket.bind(('', serverPort))
# mapping server socket to server port using bing() method
serverSocket.listen(1)
# listen(1) means that 1 client can use connection at a time
print("The server is ready to receive.")
try:
# without key board interruption or error try under codes while true
while True:
connectionSocket, clientAddress = serverSocket.accept()
# after call accept() method, server socket waits for connection request from client
# if the connection success, return client socket and client address
message = connectionSocket.recv(2048)
# receive message from client socket with buffer sixe 2048
# recieved message is stored in 'message' variable
modifiedMessage = message.decode().upper()
# decode message byte to string, then transform the string to uppercase using upper() method
# transformed result is stored in 'modifiedMessage' variable
connectionSocket.send(modifiedMessage.encode())
# encode modifiedMessage string to byte using encode() method
# send it to client socket using send() method
connectionSocket.close()
# close client socket after finishing send()
except KeyboardInterrupt:
# handle key board interruption
print("Press Ctrl-C to terminate while statement")
pass
from socket import *
파이썬에서 기본적으로 제공하는 모듈로 파이썬이 설치되어 있다면 별도의 설치 없이 import 해서 사용할 수 있습니다.
serverPort = 12000
서버포트 넘버를 설정해줍니다.
serverSocket = socket(AF_INET, SOCK_STREAM)
socket 함수를 이용해서 서버 소켓을 만들어줍니다.
socket(param1, param2) : 여기서 param1으로 주어진 AF_INET은 IPv4, param2로 주어진 SOCK_STREAM은 TCP 소켓을 의미합니다.
serverSocket.bind(('', serverPort))
서버 소켓에 선언했던 서버 포트 넘버를 바인드 해줍니다.
serverSocket.listen(1)
print("The server is ready to receive.")
TCP 연결에서 클라이언트가 보내는 요청을 서버가 listen 하게 합니다. 이때 전달되는 파라미터는 큐에 쌓일 수 있는 connection의 최대 개수로 1 이상의 수로 지정해야 합니다.
try:
while True:
connectionSocket, clientAddress = serverSocket.accept()
서버소켓의 accept() 메소드를 이용해서 connectionServer라는 새로운 소켓을 만듭니다. 이 소켓은 특정 클라이언트 즉, 요청을 보낸 클라이언트를 위해 사용되는 소켓입니다. clientAddress는 요청을 보낸 클라이언트의 IP 주소와 포트 넘버를 저장하는 변수입니다. 클라이언트와 서버는 hand-shaking을 완료하고, 클라이언트의 소켓과 서버의connectionSocket이 연결됩니다.
message = connectionSocket.recv(2048)
TCP 연결이 만들어지면, 클라이언트와 서버는 바이트 단위로 메시지를 주고받을 수 있습니다. recv() 메소드에 버퍼 사이즈를 2048로 설정하는 인자를 전달하면서 message라는 변수에 클라이언트가 보낸 문자열을 저장합니다. 서버는 클라이언트가 보내는 메시지의 맨 끝에 도달할 때까지 문자열을 저장합니다.
modifiedMessage = message.decode().upper()
서버는 클라이언트에게서 전달받은 메시지를 decode로 해독하고 upper() 메소드로 uppercase 문자열로 변환하여 modifiedMessage라는 변수에 저장합니다.
connectionSocket.send(modifiedMessage.encode())
modifiedMessage를 encode하여 connectionSocket에 바이트 단위로 보냅니다.
connectionSocket.close()
변환된 메시지 전송을 완료하면 연결된 소켓을 close 합니다.
except KeyboardInterrupt:
print("Press Ctrl-C to terminate while statement")
pass
close 한 뒤에도 계속 while loop을 돌며 다른 클라이언트 연결을 기다리거나 ctrl+c로 종료시킬 수 있습니다.
client.py
# client.py
from socket import *
# import socket package
serverName = "127.0.0.1"
serverPort = 12000
# set server name as '127.0.0.1" which means localhost
# localhost is a reserved IP address for virtually supported IP address by OS
# set server port as 12000 which is same as server port number set in server program
clientSocket = socket(AF_INET, SOCK_STREAM)
# create client socket with socket() method
# AF_NET means using IPv4
# SOCK_STREAM means using TCP protocol
clientSocket.connect((serverName, serverPort))
# create connection request to set IP address and port number using connect() method
# this connection request is accepted by server program with accept() method
message = input("Input lowercase sentence:")
# get input from the user
clientSocket.send(message.encode())
# transform message to bytes with encode() method
# send it to the server through client socket
modifiedMessage = clientSocket.recv(2048)
# receive processed message back from server with recv() method
print(modifiedMessage.decode())
# print the result
clientSocket.close()
# close client socket after connection is finished
from socket import *
serverName = "127.0.0.1"
serverPort = 12000
서버 이름과 호트 넘버를 각각 설정합니다.
clientSocket = socket(AF_INET, SOCK_STREAM)
clientSocket.connect((serverName, serverPort))
클라이언트 소켓을 만들고 connect() 메소드에 서버 이름과 포트 넘버를 전달하여 연결합니다.
message = input("Input lowercase sentence:")
사용자에게 input으로 message를 입력 받습니다 .
clientSocket.send(message.encode())
입력 받은 메시지를 encode하여 소켓을 통해 보냅니다.
modifiedMessage = clientSocket.recv(2048)
recv() 메소드를 이용해 서버로 부터 메시지를 전달받습니다. 이 때 버퍼 사이즈를 2048로 설정하는 것입니다.
print(modifiedMessage.decode())
clientSocket.close()
UDP
TCP와 동일하나 socket을 만들때, 두번째 파라미터에 SOCK_STREAM 대신 SOCK_DGRAM을 주는 것이 핵심입니다.
나머지는 같습니다.
server.py
# server.py
from socket import *
# import socket package
serverPort = 12000
# set server port number as 12000
serverSocket = socket(AF_INET, SOCK_DGRAM)
# create server socket with socket() method
# AF_INET means using IPv4
# SOCK_DGRAM measn using UDP protocol
serverSocket.bind(('', serverPort))
# mapping server socket to server port using bing() method
# then open the connection
print("The server is ready to receive")
try:
# without key board interruption try under codes while true
while True:
message, clientAddress = serverSocket.recvfrom(2048)
# receive message from the client using recvfrom() method
modifiedMessage = message.decode().upper()
# decode message from bytes to string using encode() method
# transform the message to uppercase using upper() medthod
# store the modified message to variable
serverSocket.sendto(modifiedMessage.encode(), clientAddress)
# send encoded modifiedMessage to client using sendto() method
except KeyboardInterrupt:
print("Press Ctrl-C to terminate while statement")
pass
# Unlike TCP protocol, UDP protocol is not keep connection
# Therefore, it should use sendto ans recvfrom method
client.py
# client.py
from socket import *
# import socket package
serverName = "127.0.0.1"
serverPort = 12000
# set server name (ip address) and server port number
# server port number is same as the one set in server program
clientSocket = socket(AF_INET, SOCK_DGRAM)
# create client socket using socket() method
# AF_INET means using IPv4
# SOCK_DGRAM measn using UDP protocol
message = input("Input lowercase sentence:")
# get message from user
clientSocket.sendto(message.encode(), (serverName, serverPort))
# send the encoded message to server which is spedified with ip address and port number
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)
# recv processed message through socket using recvfrom() method
print(modifiedMessage.decode())
# print the result
clientSocket.close()
# close socket after the connection is finished
'컴퓨터 공학 > 컴퓨터 네트워크' 카테고리의 다른 글
[컴퓨터 네트워크] Chapter4) Network Layer 네트워크 계층 (0) | 2021.04.20 |
---|---|
[Python3/컴퓨터 네트워크] 소켓 프로그래밍 : html request를 보내는 클라이언트와 request 받은 파일을 찾아 웹 브라우저로 보여주는 서버 프로그램 (0) | 2021.04.08 |
[Python3/컴퓨터 네트워크] 소켓 프로그래밍 : 입력한 문자열 reverse 하는 클라이언트 서버 프로그램 (0) | 2021.04.08 |
[컴퓨터 네트워크] Chapter3) Computer Network : Transport Layer (0) | 2021.03.29 |
[컴퓨터 네트워크] Application Layer 패러다임 : Peer-to-Peer(P2P) 패러다임 (0) | 2021.03.25 |