Python實作簡單的HttpServer伺服器
本篇文章主要介紹了Python實作簡單的HttpServer伺服器範例,小編覺得蠻不錯的,現在分享給大家,也給大家做個參考。一起跟著小編過來看看吧
要寫一個類似tomcat的簡易伺服器,首先要弄清楚這幾點:
1. 客戶端(Client)和服務端(Server)的角色及角色
角色A向角色B請求數據,這時可以把A視為客戶端,B視為服務端。客戶端的主要職責是發送請求和接收服務端根據自己發送的請求返回的請求訊息,而服務端的主要職責是接收請求和返回請求資料。
2. 瀏覽器是什麼及工作原理
我們常說B/S,C/S架構,所謂的B/S指browser/server,C /S指Client/Server,B/S架構其實就是應用於瀏覽器的程序,只要最後在瀏覽器上展現的都是B/S架構,而非在瀏覽器上展現的都是C/S架構,如常見的英雄聯盟遊戲。但本質上只有C/S架構,因為瀏覽器是一種特殊的客戶端。
瀏覽器的特殊之處是有一下三大引擎:
-
#DOM解析引擎:也就是瀏覽器可以解析HTML
樣式解析引擎:即瀏覽器可以解析CSS
#腳本解析引擎:即瀏覽器可以解析JAVASCRIPT
3. Socket
上面提到的客戶端服務端,他們之間是怎樣實現連接及資料傳遞的,這就是Socket,每一門程式語言都有Socket編程,Socket的作用就是提供了網路通訊的能力
4. HTTP協定及HTTP與TCP/TP的區別
客戶端與服務端透過Socket實現了網路通訊的能力,可以實現資料傳遞。而協定是規範資料傳輸,也就是說客戶端和服務端之間傳輸資料要依照一定得規範和標準傳輸,不能瞎傳。
TCP/IP(Transmission Control Protocol/Internet Protocol):傳輸控制協定/網間協定
HTTP(HyperText Transfer Protocol):超文本傳輸協定。
TCP/TP的區別:
做一個形象的比喻,TCP/TP是馬路,HTTP則是馬路上的汽車,所以HTTP一定是在TCP/TP的基礎上的。
HTTP主要應用在web程式上,設計之初就是為了提供一種發佈和接收HTML頁面的方法,這樣說可能很抽像很難理解。具體的說當我們去訪問一個網站時,只需要拿到基於這個網站的內容(比如html,css,JavaScript)。但我們抓取瀏覽器接收到的資源包(可以用Fiddler工具)發現除了網頁需要的實體內容還有一些下面資訊:
HTTP/1.1 200 OK
Cache-Control : private
Content-Type: text/plain; charset=utf-8
Content-Encoding: gzip
Vary: Accept-Encoding
Server: Microsoft-IIS/7.5
X-AspNet -Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Tue, 24 Jan 2017 03:25:23 GMT
Connection: #close
Content-Length: 661
Connection:#close
5. URL的含義
URL(統一資源定位符),就是我們常說的網址,直接來解析一個URL來說明他:http://198.2.17.25:8080/webapp/index.html
這個意思是找到IP為198.2.17.25的伺服器下目錄為webapp的index.html
但是我們常看到的是這樣的URL:http://goodcandle.cnblogs.com/archive/2005/12/10/294652.aspx
import socket import sys import getFileContent #声明一个将要绑定的IP和端口,这里是用本地地址 server_address = ('localhost', 8080) class WebServer(): def run(self): print >>sys.stderr, 'starting up on %s port %s' % server_address #实例化一个Socket sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #绑定IP和端口 sock.bind(server_address) #设置监听 sock.listen(1) #这里首先给个死循环,其实这里是需要多线程的,再后续版本将会实现 while True: #接受客户端的请求并得到请求信息和请求的端口信息 connection, client_address = sock.accept() print >>sys.stderr, 'waiting for a connection' try: #获取请求信息 data = connection.recv(1024) if data: #发送请求信息 connection.sendall(getFileContent.getHtmlFile(data)) finally: connection.close() if __name__ == '__main__': server=WebServer() server.run()
webServer.py很清晰簡潔,
connection.sendall()服務端回傳訊息給瀏覽器,但是發送的資料必須遵循HTTP協定規範getFileContent.py是對發送的資料進行HTTP協定規範處理
import sys import os #得到要发送的数据信息 def getHtmlFile(data): msgSendtoClient="" requestType=data[0:data.find("/")].rstrip() #判断是GET请求还是POST请求 if requestType=="GET": msgSendtoClient=responseGetRequest(data,msgSendtoClient) if requestType=="POST": msgSendtoClient=responsePostRequest(data,msgSendtoClient) return msgSendtoClient #打开文件,这里不直接写,二是去取要发送的文件再写 def getFile(msgSendtoClient,file): for line in file: msgSendtoClient+=line return msgSendtoClient #筛选出请求的一个方法 def getMidStr(data,startStr,endStr): startIndex = data.index(startStr) if startIndex>=0: startIndex += len(startStr) endIndex = data.index(endStr) return data[startIndex:endIndex] #获取要发送数据的大小,根据HTTP协议规范,要提前指定发送的实体内容的大小 def getFileSize(fileobject): fileobject.seek(0,2) size = fileobject.tell() return size #设置编码格式和文件类型 def setParaAndContext(msgSendtoClient,type,file,openFileType): msgSendtoClient+="Content-Type: "+type+";charset=utf-8" msgSendtoClient+="Content-Length: "+str(getFileSize(open(file,"r")))+"\n"+"\n" htmlFile=open(file,openFileType) msgSendtoClient=getFile(msgSendtoClient,htmlFile) return msgSendtoClient #GET请求的返回数据 def responseGetRequest(data,msgSendtoClient): return responseRequest(getMidStr(data,'GET /','HTTP/1.1'),msgSendtoClient) #POST请求的返回数据 def responsePostRequest(data,msgSendtoClient): return responseRequest(getMidStr(data,'POST /','HTTP/1.1'),msgSendtoClient) #请求返回数据 def responseRequest(getRequestPath,msgSendtoClient): headFile=open("head.txt","r") msgSendtoClient=getFile(msgSendtoClient,headFile) if getRequestPath==" ": msgSendtoClient=setParaAndContext(msgSendtoClient,"text/html","index.html","r") else: rootPath=getRequestPath if os.path.exists(rootPath) and os.path.isfile(rootPath): if ".html" in rootPath: msgSendtoClient=setParaAndContext(msgSendtoClient,"text/html",rootPath,"r") if ".css" in rootPath: msgSendtoClient=setParaAndContext(msgSendtoClient,"text/css",rootPath,"r") if ".js" in rootPath: msgSendtoClient=setParaAndContext(msgSendtoClient,"application/x-javascript",rootPath,"r") if ".gif" in rootPath: msgSendtoClient=setParaAndContext(msgSendtoClient,"image/gif",rootPath,"rb") if ".doc" in rootPath: msgSendtoClient=setParaAndContext(msgSendtoClient,"application/msword",rootPath,"rb") if ".mp4" in rootPath: msgSendtoClient=setParaAndContext(msgSendtoClient,"video/mpeg4",rootPath,"rb") else: msgSendtoClient=setParaAndContext(msgSendtoClient,"application/x-javascript","file.js","r") return msgSendtoClient
以上是Python實作簡單的HttpServer伺服器的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

在 Sublime Text 中運行 Python 代碼,需先安裝 Python 插件,再創建 .py 文件並編寫代碼,最後按 Ctrl B 運行代碼,輸出會在控制台中顯示。

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

Golang在性能和可擴展性方面優於Python。 1)Golang的編譯型特性和高效並發模型使其在高並發場景下表現出色。 2)Python作為解釋型語言,執行速度較慢,但通過工具如Cython可優化性能。

在 Visual Studio Code(VSCode)中編寫代碼簡單易行,只需安裝 VSCode、創建項目、選擇語言、創建文件、編寫代碼、保存並運行即可。 VSCode 的優點包括跨平台、免費開源、強大功能、擴展豐富,以及輕量快速。

在 Notepad 中運行 Python 代碼需要安裝 Python 可執行文件和 NppExec 插件。安裝 Python 並為其添加 PATH 後,在 NppExec 插件中配置命令為“python”、參數為“{CURRENT_DIRECTORY}{FILE_NAME}”,即可在 Notepad 中通過快捷鍵“F6”運行 Python 代碼。
