日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

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

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

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

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

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

具體實現(xiàn)的功能有:

  • 向服務(wù)器請求特定文件,從服務(wù)器文件系統(tǒng)讀取請求的文件,并創(chuàng)建一個由請求的文件的html內(nèi)容組成的HTTP響應(yīng)報文反饋給瀏覽器并顯示出來
    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> 從后臺可以看到請求的文件的內(nèi)容
從瀏覽器端顯示出的訪問服務(wù)器文件成功的頁面
  • 多線程
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> 多個客戶端訪問服務(wù)器時,都可以并發(fā)地訪問,通過后臺觀察打印出的地址可以發(fā)現(xiàn)服務(wù)器已經(jīng)接收到了多個客戶端的訪問,并且服務(wù)器為每個客戶端聯(lián)系時均建立了連接套接字 從瀏覽器訪問可以看出,可以同時打開兩個頁面訪問本地服務(wù)器,其中服務(wù)器的端口號為4004
  • 異常檢測

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

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> <!--打開網(wǎng)頁圖片--> <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>

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

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。