본문 바로가기

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

[Python3/컴퓨터 네트워크] 소켓 프로그래밍 : 멀티 쓰레드

성균관대학교 소프트웨어학과 추현승 교수님의 2021년도 1학기 네트워크 개론 수업 과제 입니다. 

 

아래 링크에서 수행했던 클라이언트 서버 프로그램에서 서버 프로그램이 멀티쓰레딩이 가능하도록 바꾸는 과제 입니다. 

 

[Python3/컴퓨터 네트워크] 소켓 프로그래밍 : html request를 보내는 클라이언트와 request 받은 파일을

성균관대학교 소프트웨어학과 추현승 교수님의 2021년도 1학기 네트워크 개론 수업 과제 입니다. 서버 프로그램의 스켈레톤 코드가 주어지고, 빈 코드를 채워 서버 프로그램을 완성하고 이 서버

seungyooon.tistory.com

코드에 대한 설명은 주석을 참고해주세요 


 

server.py

#import socket module
from socket import *
#import threading module for multiprocessing
import threading

#receiving request
def service():
    try:
        #get messages from client througth socket 
        message = connectionSocket.recv(65535).decode()
        #get requested file name 
        filename = message.split()[1]
        #open file that named requeste file name 
        f = open(filename[1:])
        outputdata = f.read()
        f.close()
        #add HTTP header line to output data to tell HTTP status 
        outputdata = 'HTTP/1.1 200 OK\r\n\r\n' + outputdata
        #send output data (http status + requested file contents)
        connectionSocket.send(outputdata.encode())
        connectionSocket.close()
        print("OK!")
    #handle error 
    except IOError:
        #Send response message for file not found
        outputdata = 'HTTP/1.1 404 Not Found\r\n\r\n'
        #Close client socket
        connectionSocket.close()

#Prepare a sever socket - TCP 
serverSocket = socket(AF_INET, SOCK_STREAM)
serverPort = 12345
serverSocket.bind(("", serverPort))
#Listen 100 sockets at the same time
serverSocket.listen(100)

while True:
    #Establish the connection
    print('Ready to serve...')
    connectionSocket, addr = serverSocket.accept()
    #Create thread queue for multithreading
    q = threading.Thread(target=service)
    #start to service in order to q
    q.start()

#close server socket 
serverSocket.close()

client.py

from socket import *

serverName = '127.0.0.1'
serverPort = 12345
requestFilename = '/requestedFile.html'
responseFilename = 'responsedFile.html'
clientSocket = socket(AF_INET, SOCK_STREAM)
clientSocket.connect((serverName, serverPort))

request = 'GET %s %s %s' %(requestFilename, serverName, serverPort)
clientSocket.send(request.encode())

result = clientSocket.recv(65535)
status = int(result.decode().split('\n')[0].split(' ')[1])
filecontent = result.split('\r\n')[2:]

if (status == 200) :
    f = open(responseFilename, 'wb')
    f.write(''.join(filecontent))
    f.close()

    f = open(responseFilename, 'r')
    lines = f.readlines()
    for line in lines:
        print(line)
    f.close()

clientSocket.close()

requestedFile.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>This is problem 3</h1>
</body>
</html>