본문 바로가기

컴퓨터 공학/컴퓨터 네트워크

[Python3/컴퓨터 네트워크] 소켓 프로그래밍 : html request를 보내는 클라이언트와 request 받은 파일을 찾아 웹 브라우저로 보여주는 서버 프로그램

성균관대학교 소프트웨어학과 추현승 교수님의 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()