設計乙個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分鐘。...