日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

利用python编写设计多线程web服务器(计算机网络_自顶向下第六版_第二章1和4的编程作业)

發布時間:2025/3/21 python 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用python编写设计多线程web服务器(计算机网络_自顶向下第六版_第二章1和4的编程作业) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

???????今天翻看自己以前的博客時,發現了這則博客,距今大約也有一年多的時間了,覺得還是蠻有趣的一個作業,于是跟著博客又做了一遍,覺得之前的排版有點不大好,所以此番用markdown 稍微重做些修改更新一下博客。

???????顧名思義,本博客是介紹如何用python編寫一個多線程web服務器,于是我利用socket模塊寫了個TCP服務器,程序很簡單,運行程序后,通過瀏覽器端輸入:

localhost:port/xxxxxx

可以訪問到本地文件目錄中的文件,我在本地編寫了兩個html文件用于訪問測試:

  • Success.html

    <!DOCTYPE html> <html> <head><title></title> <meta http-equiv="content-type" content="text/html"; charset="utf-8"/> </head> <body> </br> <center><h2>Connect to local web server!</h2></center> <center><img src="http://i2.sinaimg.cn/ent/m/c/2008-03-16/U2507P28T3D1949676F326DT20080316182933.jpg" width="300px"/></center> </br> <center><h4><a href="https://blog.csdn.net/wobeatit/article/details/88077445">MyCSDN</a></h4></center> </body> </html>
  • Fail.html

    <!DOCTYPE html> <html> <head><title></title> <meta http-equiv="content-type" content="text/html"; charset="utf-8"/> </head> <body> <center><h2>所訪問的路徑不存在!</h2></center> </br> <!--打開網頁圖片--> <center><img src="https://image.freepik.com/free-vector/404-error-web-template-with-cow-flying-flat-style_23-2147777436.jpg" width="400px"/></center> </br></br> <center><h4><a href="https://blog.csdn.net/wobeatit/article/details/88077445">LQ的博客</a></h4><center> </body> </html>
  • 附上Python源代碼:

#*************************************# #*** python 多線程web服務器的設計 ****# #*** Author LQ ****# #*** Python 版本:3.6.2 ****# #*************************************##-*- coding: utf-8 -*- from socket import * import threading # 引入線程模塊 import os# 針對線程使用編寫的函數 def Server(tcpClisock, addr):BUFSIZE = 1024 # 將緩沖區大小設置為 1KB。listen()方法的參數是在連接被轉接或拒絕之前,傳入連接請求的最大數print('connected from:', addr) rec = tcpClisock.recv(BUFSIZE)data = rec.decode()# 當服務器因為網絡問題未收到返回信息時,直接退出if len(data) == 0:tcpClisock.close()return HOME_DIR = os.getcwd() # 服務器端可訪問的文件目錄print("***************************************************\n")index = 4 # 檢索文件的搜索路徑# 找到路徑while data[index] != ' ':index += 1# 如果檢索文件為空,則默認導向訪問成功的頁面if index == 5 : direction = os.path.join(HOME_DIR, "Success.html") else: direction = os.path.join(HOME_DIR, data[5 : index]) # 拼接出完整的路徑# 如果路徑存在,本服務器默認只支持訪問html文件if os.path.exists(direction) and direction.endswith(".html"):file=open(direction) # 打開路徑中的文件SUCCESS_PAGE = "HTTP/1.1 200 OK\r\n\r\n" + file.read() # 構造成功報文反饋給服務器print(SUCCESS_PAGE)tcpClisock.sendall(SUCCESS_PAGE.encode()) # 返回給客戶端瀏覽器成功的頁面# sendall 函數只可發送字節類型,對字符串數據進行轉換tcpClisock.close() # 關閉專門針對一個客戶機程序創建的新套接字# 如果路徑不存在,返回失敗頁面else:FAIL_PAGE = "HTTP/1.1 404 NotFound\r\n\r\n" + open(os.path.join(HOME_DIR, "Fail.html")).read()print(FAIL_PAGE)tcpClisock.sendall(FAIL_PAGE.encode()) # 返回給客戶端瀏覽器失敗的頁面# sendall 函數只可發送字節類型,對字符串數據進行轉換tcpClisock.close() # 關閉專門針對一個客戶機程序創建的新套接字if __name__ =='__main__': HOST = "" # HOST 變量是空白的,這是對 bind()方法的標識,表示它可以使用任何可用的地址 # 此程序在什么主機上運行,就會為該主機的IP地址PORT = 4004 # 隨機的端口號,并且該端口號似乎沒有被使用或被系統保留ADDR = (HOST, PORT) # 地址 = 主機名 + 端口號tcpSersock = socket(AF_INET, SOCK_STREAM) # 創建一個套接字對象tcpSersock.bind(ADDR) # 將套接字綁定到服務器地址 相當于歡迎套接字,且綁定的是源ip地址以及源端口號。始終歡迎別的套接字的申請接入tcpSersock.listen(5) # 啟用服務器的監聽,調用參數是在連接被轉接或拒絕之前,傳入連接請求的最大數,此處說明允許傳入鏈接請求數為5print("waiting for connection......\n") while True: #進入無限循環tcpClisock, addr = tcpSersock.accept() # 調用 accept()函數之后,就開啟了一個簡單的(單線程)服務器,它會等待客戶端的連接。# 默認情況下,accept()是阻塞的,這意味著執行將被暫停,直到一個連接到達。# 當一個傳入的請求到達時,服務器會創建一個新的通信端口來直接與客戶端進行通信,再次空出主要的端口# 使用新的客戶端套接字能夠空出主線(原始服務器套接字)以使其能夠接受新的客戶端連接。 thread = threading.Thread(target=Server, args=(tcpClisock, addr)) thread.start() # 開始執行該線程tcpSersock.close() # 這種情況永遠也不會碰到,因為在此程序中,服務器始終在一個無限循環中運行# 但如果寫了一個處理程序,當一個處理程序檢測到一些外部條件時,服務器就應該關閉。應該調用一個 close()方法關閉服務器的歡迎套接字

具體實現的功能有:

  • 向服務器請求特定文件,從服務器文件系統讀取請求的文件,并創建一個由請求的文件的html內容組成的HTTP響應報文反饋給瀏覽器并顯示出來
    HTTP/1.1 200 OK<!DOCTYPE html> <html> <head><title></title> <meta http-equiv="content-type" content="text/html"; charset="utf-8"/> </head> <body> </br> <center><h2>Connect to local web server!</h2></center> <center><img src="http://i2.sinaimg.cn/ent/m/c/2008-03-16/U2507P28T3D1949676F326DT20080316182933.jpg" width="300px"/></center> </br> <center><h4><a href="https://blog.csdn.net/wobeatit/article/details/88077445">MyCSDN</a></h4></center> </body> </html> 從后臺可以看到請求的文件的內容
從瀏覽器端顯示出的訪問服務器文件成功的頁面
  • 多線程
connected from: ('127.0.0.1', 59634) ***************************************************HTTP/1.1 200 OK<!DOCTYPE html> <html> <head><title></title> <meta http-equiv="content-type" content="text/html"; charset="utf-8"/> </head> <body> </br> <center><h2>Connect to local web server!</h2></center> <center><img src="http://i2.sinaimg.cn/ent/m/c/2008-03-16/U2507P28T3D1949676F326DT20080316182933.jpg" width="300px"/></center> </br> <center><h4><a href="https://blog.csdn.net/wobeatit/article/details/88077445">MyCSDN</a></h4></center> </body> </html>connected from: ('127.0.0.1', 59670) ***************************************************HTTP/1.1 200 OK<!DOCTYPE html> <html> <head><title></title> <meta http-equiv="content-type" content="text/html"; charset="utf-8"/> </head> <body> </br> <center><h2>Connect to local web server!</h2></center> <center><img src="http://i2.sinaimg.cn/ent/m/c/2008-03-16/U2507P28T3D1949676F326DT20080316182933.jpg" width="300px"/></center> </br> <center><h4><a href="https://blog.csdn.net/wobeatit/article/details/88077445">MyCSDN</a></h4></center> </body> </html> 多個客戶端訪問服務器時,都可以并發地訪問,通過后臺觀察打印出的地址可以發現服務器已經接收到了多個客戶端的訪問,并且服務器為每個客戶端聯系時均建立了連接套接字 從瀏覽器訪問可以看出,可以同時打開兩個頁面訪問本地服務器,其中服務器的端口號為4004
  • 異常檢測

訪問服務器中不存在的文件路徑時,后臺會返回訪問失敗的頁面:

connected from: ('127.0.0.1', 35590) ***************************************************HTTP/1.1 404 NotFound<!DOCTYPE html> <html> <head><title></title> <meta http-equiv="content-type" content="text/html"; charset="utf-8"/> </head> <body> <center><h2>所訪問的路徑不存在!</h2></center> </br> <!--打開網頁圖片--> <center><img src="https://image.freepik.com/free-vector/404-error-web-template-with-cow-flying-flat-style_23-2147777436.jpg" width="400px"/></center> </br></br> <center><h4><a href="http://blog.csdn.net/wobeatit/article/details/78641032">LQ的博客</a></h4><center> </body> </html>

此時瀏覽器端會返回訪問失敗的頁面:

總結

以上是生活随笔為你收集整理的利用python编写设计多线程web服务器(计算机网络_自顶向下第六版_第二章1和4的编程作业)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。