python 簡易WEB伺服器

2021-08-19 20:18:11 字數 3029 閱讀 6827

設計乙個web服務,滿足以下基本功能: 

建立套接字(使用埠號:6699)

獲取http請求,並解析http請求報文

顯示請求報文各字段的欄位名和值,對部分字段進行說明

根據http請求報文獲得物件檔案路徑名

根據路徑名開啟本地檔案

封裝本地檔案到http響應報文

使用套接字傳送http相應報文

# 瀏覽器輸入發回給自己)

# 直接開啟網頁

# 伺服器程式

from socket import *

import io

import time

# 報文字典

requestdic =

# 型別報文轉換字典

contenttypedic =

# 全域性計數器

count = 1

# 報文解析

def requestreader(request):

global count

# 若報文為空,則直接返回

if not request:

path = 1

version = contenttype = 0

return path, version, contenttype

# 讀取請求報文的資訊

requeststr = bytes.decode(request) # 轉碼

requestlist = requeststr.split('\r\n')

firstline = requestlist[0].split() # 根據行來拆分

info = firstline[0]

path = firstline[1][1:]

version = firstline[2]

contenttype = path.split('.')[-1]

# 分析報文首行

print('-------------------------------------')

print('第{}份報文:\n首部方法:{}\nurl:{}\n版本:{}'.format(count, info, path, version))

count += 1

# 分析剩餘報文

for i in range(1,len(requestlist)):

if requestlist[i] == '':

break

line = requestlist[i].split(':')

print("{}:{}".format(requestdic[line[0]], line[1]))

return path, version, contenttype

# 讀請求的檔案

def read(path):

try:

f = io.open(path, 'rb') # 以bytes格式開啟檔案

data = f.read() # 讀取全部

return data # 返回並新增至報文

f.close()

except:

return 1 # 如果路徑不存在,則返回「1」

# 封裝響應報文

def makeres(version, data, contenttype):

responsestr = version + " 200 ok\n" # 開始行

responsestr += "connection: keep-alive\n" # 保持連線

# 讀取時間

localtime = time.asctime(time.localtime(time.time())).split()

timestr = "{}, {} {} {} {} gmt+8".format(localtime[0], localtime[2], localtime[1], localtime[-1], localtime[-2])

responsestr += "date: " + timestr + "\n"

responsestr += "server: pythonwebserver" + "\n"

responsestr += "content-lenth: " + str(len(data)) + "\n" # 文字長度

responsestr += "content-type:" + contenttypedic[contenttype] + "\n\n" # 文字型別

requestmessage = bytes(responsestr, encoding='utf-8') # 轉換為bytes類

requestmessage += data

return requestmessage

serverport = 6699 # 埠號

serversocket = socket(af_inet, sock_stream) # 歡迎套接字

serversocket.bind(('', serverport)) # 開啟歡迎套接字

serversocket.listen(1) # 併發連線數

print('the server is ready to receive')

while true:

connectionsocket, addr = serversocket.accept() # 接收資料

request = connectionsocket.recv(1024)

# 分析報文

path, version, contenttype = requestreader(request)

# 傳送響應報文

data = read(path) # 讀取響應檔案

if read(path) != 1: # 判斷存在,若不存在則直接關閉連線

requestmessage = makeres(version, data, contenttype)

connectionsocket.sendall(requestmessage)

connectionsocket.close()

簡易web伺服器

1.設定伺服器端口號,獲取伺服器ip位址。2.建立伺服器監聽socket socket 3.連線伺服器socket和埠號 bind 4.讓伺服器socket處於監聽狀態 listen 5.在迴圈中呼叫accept 獲取客戶端連線的socket。accept 預設阻塞,直到有客戶端連線後返回連線套接字...

Python搭建簡易伺服器

使用basehttprequesthandler處理請求,httpserver建立socket伺服器 利用requests庫進行post,get 定義好c s間傳遞的引數和協議 對引數進行處理後進行返回 讀取post傳遞的資料報,字元長度不能省略不然會導致阻塞 do sth self.send re...

web伺服器 簡單web伺服器實現

三次握手 一般情況下是瀏覽器先傳送請求資料,c s ack 應答 三次握手成功後,才開始進行通訊資料的收發。四次揮手 一般情況下是客戶端先關閉,給瀏覽器傳送關閉資訊。如果瀏覽器傳送了關閉資訊,但是伺服器沒有回過去,較慢 那麼瀏覽器一直發是不是就會有問題?所以會等待 2msl的時間。一般為2 5分鐘。...