"""建立web類"""
def __init__(self):
"""建立server物件"""
self.server = socket.socket(socket.af_inet,socket.sock_stream)
# 重複使用繫結的資訊
self.server.setsockopt(socket.sol_socket, socket.so_reuseaddr, 1)
def bind(self,port):
"""邦定埠號"""
self.server.bind(('', port))
def start(self):
"""開始監聽客戶端的鏈結"""
self.server.listen(10)
while true:
conn, address = self.server.accept()
print("客戶端[%s]連線進來了" % str(address))
p = process(target=self.receive_request, args=(conn,))
p.start()
#(1)建立子程序的時候,子程序已經從父程序中複製過了conn,所以可以關閉父程序中的conn了
conn.close()
def receive_request(self, conn):
"""接收客戶端的鏈結"""
request_info = conn.recv(1024).decode()
#print(request_info)
self.handle_request(request_info, conn)
def handle_request(self, request, conn):
"""處理客戶端的請求資訊"""
relative_path = request.splitlines()[0].split()[1]
print(request)
#(2)
path = re.sub('/', r'\\', relative_path)
self.response_info(conn, path)
def response_info(self, conn, relative_path):
"""將頁面返回給瀏覽器"""
filename = home_dir+relative_path
if '\\' == relative_path:
filename = home_dir+'\index.html'
print(filename)
try:
f = open(filename, 'rb') #(3)有可能是,為二進位制資料
測試:
解釋:以上就算大概的測試成功了,其中**中有兩處需要注意的地方:
這裡關閉conn,是因為建立子程序的時候,子程序已經從父程序中複製過了conn,所以可以關閉父程序中的conn了。
這裡檔案都用二進位制開啟,以及二進位制的形式組合字串最好。因為當我們要訪問乙個html檔案時,如里html檔案裡面有的鏈結位址,以二進位制開啟,不能解碼為字元器與響應報文組合了。所以不如一起都是二進位制來組合。
(3)我們訪問乙個頁面為什麼連了四個客戶端?
第乙個是獲取exc8.html檔案
第三個也是exc8.html檔案中的resume的位址的訪問
用python編寫乙個小遊戲
1.隨機生成兩個數字 1 1000 在控制台中隨機獲取兩個數字相加 如果使用者輸入正確得10分,否則扣10分。總共5道題,最後輸出得分 import random grade 0for i in range 5 num1 random.randint 1,100 num2 random.randin...
用python編寫乙個計算器
1 2 60 30 40.0 5 9 2 5 3 7 3 99 4 2998 10 568 14 4 3 16 3 2 通過python實現,自動判斷括號以及加減乘除的運算優先順序,得出運算結果,顯示運算步驟 import redef atom cal exp if in exp 計算單個的乘法 a...
用python編寫乙個vim目錄管理外掛程式
命令 作用例項 py3 執行一條python語句 py3fprint hello world py3f 執行乙個python模組 py3f test.py 即在python中可以 import vim 然後使用該模組操作vim 表示vim當前所在 其中提供了如下屬性 line 當前所在行 buffe...