성균관대학교 소프트웨어학과 추현승 교수님의 2021년도 1학기 네트워크 개론 수업 과제 입니다.
서버 프로그램의 스켈레톤 코드가 주어지고, 빈 코드를 채워 서버 프로그램을 완성하고
이 서버 프로그램에 요청을 보내는 클라이언트 프로그램을 파이썬으로 작성하는 것이 과제였습니다.
서버 프로그램은 TCP 프로토콜을 사용하며 클라이언트로부터 요청 받은 파일을 ./ 현 디렉토리에서 찾아 있다면 200 http status를 전송하고 해당 파일 코드를 클라이언트로 전송하고 없다면 404 status 메시지를 전송합니다.
클라이언트는 전달받은 메시지에서 상태가 200이라면 전송된 파일 코드를 다시 html 파일로 작성하여 웹 브라우저로 열어봅니다. 만약 400을 전달 받았다면 그냥 콘손에 상태 메시지만 띄우게 됩니다 .
코드에 대한 설명은 주석을 참고해주세요.
server.py
#import socket module
from socket import *
#Prepare a server socket
# IPv4, TCP protocol
serverSocket = socket(AF_INET, SOCK_STREAM)
# mapping socket to port number and server name
# '' means itself (loop back address)
serverSocket.bind(('', 12345))
# listen port number, listen(0) means automatically listening
serverSocket.listen(0)
while True:
#Establish the connection
print('Ready to serve...')
connectionSocket, addr = serverSocket.accept()
try:
# receive message through socket when it the connection is created
message = connectionSocket.recv(65535)
# get filename from request message
filename = message.split()[1]
# open requested file which is located in the same directory as server program (this file)
f = open('.' + filename.decode(), 'rt', encoding='utf-8')
# store requestedFile data
outputdata = f.read()
# file close
f.close()
# add http status line to output data
sendingData = 'HTTP/1.1 200 OK\n' + outputdata
# Send one HTTP header line into socket
connectionSocket.send(sendingData.encode('utf-8'))
# Send the content of the requested file to the client
# for i in range(0, len(outputdata)):
# connectionSocket.send(outputdata[i].encode())
print("OK!")
connectionSocket.close()
except IOError:
# Send response message 'http status' for file not found
connectionSocket.send('HTTP/1.1 404 Not Found'.encode('utf-8'))
#Close client socket
connectionSocket.close()
# close server socket
serverSocket.close()
client.py
from socket import *
# import webbrowser module to open the file as web browser
import webbrowser
# Prepare a client socket
serverName = '127.0.0.1'
serverPort = 12345
filename = '/requestedFile.html'
# use Ipv4, TCP protocol
clientSocket = socket(AF_INET, SOCK_STREAM)
# request connection to server
clientSocket.connect((serverName, serverPort))
# http method : GET, Host: 127.0.0.1/12345
request = 'GET %s %s %s' %(filename, serverName, serverPort)
# send request to server
clientSocket.send(request.encode())
# receive message from serber through socket
result = clientSocket.recv(65535)
status = int(result.decode().split('\n')[0].split(' ')[1])
# create html file received from server only http status is 200.
if (status == 200) :
htmlResponse = ''
for i in result.decode().split('\n')[1:]:
htmlResponse += i
filepath = 'response.html'
with open(filepath, 'w') as f:
f.write(htmlResponse)
f.close()
# open web browser with received html file
webbrowser.open_new_tab(filepath)
# print http status line
print(result.decode().split('\n')[0])
# close socket
clientSocket.close()
'컴퓨터 공학 > 컴퓨터 네트워크' 카테고리의 다른 글
[컴퓨터 네트워크] 컴퓨터 네트워크 Introduction 정리 (0) | 2021.05.02 |
---|---|
[컴퓨터 네트워크] Chapter4) Network Layer 네트워크 계층 (0) | 2021.04.20 |
[Python3/컴퓨터 네트워크] 소켓 프로그래밍 : 간단한 server-client 프로그램 만들기 (0) | 2021.04.08 |
[Python3/컴퓨터 네트워크] 소켓 프로그래밍 : 입력한 문자열 reverse 하는 클라이언트 서버 프로그램 (0) | 2021.04.08 |
[컴퓨터 네트워크] Chapter3) Computer Network : Transport Layer (0) | 2021.03.29 |