web伺服器的具體介紹
1.HTTP協定介紹
HTTP是Hyper Text Transfer Protocol(超文本傳輸協定)的縮寫。它的發展是萬維網協會(World Wide Web Consortium)和Internet工作小組IETF(Internet Engineering Task Force)合作的結果,(他們)最終發布了一系列的RFC,RFC 1945定義了HTTP/1.0版本。其中最著名的就是RFC 2616。 RFC 2616定義了今天普遍使用的一個版本-HTTP 1.1。
HTTP協定(HyperText Transfer Protocol,超文本傳輸協定)是用於從WWW伺服器傳輸超文本到本機瀏覽器的傳送協定。它可以使瀏覽器更加高效,使網路傳輸減少。它不僅保證電腦正確快速地傳輸超文本文檔,還確定傳輸文檔中的哪一部分,以及哪部分內容首先顯示(如文本先於圖形)等。
HTTP是基於TCP/IP通訊協定來傳遞資料(HTML 檔案, 圖片檔案, 查詢結果等)。
HTTP是一個應用層協議,由請求和回應構成,是一個標準的客戶端伺服器模型。
HTTP是一個無狀態的協定。
![Upload 深入理解HTTP協定.jpg failed. Please try again.]

這樣就限制了使用HTTP協議,無法實現在客戶端沒有發起請求的時候,伺服器將訊息推送給客戶端。
HTTP協定是一個無狀態的協議,同一個客戶端的這次請求和上次請求是沒有對應關係。
2.http協定分析
1.瀏覽器請求

我們可以跟資料庫的CRUD增刪改查作業對應起來:
CREATE :PUT
- ##READ:GET

##UPDATE:POST
Content-Type: text/html
Content-Type指示回應的內容,這裡是text/html表示HTML網頁。
3.瀏覽器解析過程
當瀏覽器讀取到新浪首頁的HTML源碼後,它會解析HTML,顯示頁面,然後,根據HTML裡面的各種鏈接,再發送HTTP請求給新浪伺服器,拿到對應的圖片、影片、Flash、JavaScript腳本、CSS等各種資源,最後顯示出完整的頁面。
3.總結
1.HTTP請求流程
追蹤了新浪的首頁,我們來總結一下HTTP請求的流程:
步驟1:瀏覽器先向伺服器傳送HTTP請求,請求包含:
方法:GET或POST,GET只要求資源,POST會附帶使用者資料;
路徑:/full/url/path;
網域:由Host頭指定:Host: www.sina.com
以及其他相關的Header;
如果是POST,那麼請求還包括一個Body,包含用戶資料
步驟2:伺服器向瀏覽器返回HTTP回應,回應包括:
回應代碼:200表示成功,3xx表示重定向,4xx表示客戶端發送的請求有錯誤,5xx表示伺服器端處理時發生了錯誤;
回應類型:由Content-Type指定;
以及其他相關的Header;
通常伺服器的HTTP回應會攜帶內容,也就是有一個Body,包含回應的內容,網頁的HTML來源碼就在Body中。
步驟3:如果瀏覽器還需要繼續向伺服器請求其他資源,例如圖片,就再次發出HTTP請求,重複步驟1、2。
Web採用的HTTP協定採用了非常簡單的請求-回應模式,從而大大簡化了開發。當我們編寫一個頁面時,我們只需要在HTTP請求中把HTML發送出去,不需要考慮如何附帶圖片、視頻等,瀏覽器如果需要請求圖片和視頻,它會發送另一個HTTP請求,因此,一個HTTP請求只處理一個資源(此時就可以理解為TCP協定中的短連接,每個連結只獲取一個資源,如需要多個就需要建立多個連結)
HTTP協定同時具備極強的擴展性,雖然瀏覽器請求的是的首頁,但是新浪在HTML中可以鏈入其他伺服器的資源,例如,從而將請求壓力分散到各個伺服器上,並且,一個站點可以連結到其他站點,無數個站點互相連結起來,就形成了World Wide Web,簡稱WWW。
2.HTTP格式


##服務端回應訊息
- 每個HTTP請求和回應都遵循相同的格式,一個HTTP包含Header和Body兩部分,其中Body是可選的。
- HTTP協定是一種文字協議,所以,它的格式也非常簡單。
HTTP GET請求的格式:
body data goes here...
GET /path HTTP/1.1
Header1: Value1
Header2: Value2
Header3: Value3
每個Header一行一個,換行符號是\r \n或用os.linesep
HTTP POST請求的格式:
POST /path HTTP/1.1
Header1: Value1
Header2: Value2
Header3: Value3當遇到連續兩個\r\n時,Header部分結束,後面的資料全部是Body。
body data goes here...
HTTP回應的格式:
200 OK
Header1: Value1
Header2: Value2
Header3: Value3HTTP回應如果包含body,也是透過\r\n\r\n來分隔的。
4Web靜態伺服器1.顯示固定的頁面
請再次注意,Body的資料類型由Content-Type頭來決定,如果是網頁,Body就是文本,如果是圖片,Body就是圖片的二進位資料。
當存在Content-Encoding時,Body資料是被壓縮的,最常見的壓縮方式是gzip,所以,看到Content-Encoding: gzip時,需要將Body資料先解壓縮,才能得到真正的資料。壓縮的目的在於減少Body的大小,加快網路傳輸。
import socketimport multiprocessingimport osimport timedef serverHandler(clientSocket, clientAddr):'与请求的客户端进行交互'# 接收客户端发来的消息 recvData = clientSocket.recv(1024).decode('utf-8') print(recvData)# 服务端向客户端发消息,作为响应 responseLine = 'HTTP/1.1 200 OK' + os.linesep responseHeader = 'Server: laowang' + os.linesep responseHeader += 'Date: %s' % time.ctime() + os.linesep responseBody = '差一点一米八' sendData = (responseLine + responseHeader + os.linesep + responseBody).encode('gbk') clientSocket.send(sendData)# 关闭 clientSocket.close()def main():'程序入口'# socket对象 serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 绑定的端口号,可以重复使用端口号#serverSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)# 绑定 serverSocket.bind(('', 8000))# 监听 serverSocket.listen()while True:# 接收 clientSocket, clientAddr = serverSocket.accept() print(clientSocket)# 开一个新的进程,执行交互 multiprocessing.Process(target=serverHandler, args=(clientSocket, clientAddr)).start()# 关闭客户端对象 clientSocket.close()if __name__ == '__main__': main()

客戶端瀏覽器頁面
import time,multiprocessing,socket,os,re
G_PATH = './html'
def serveHandler(clientSocket,clientAddr):
recvData = clientSocket.recv(1024).decode('gbk')
lineFirst = recvData.splitlines()[0]
strFirst = re.split(r' +',lineFirst)
fileName = strFirst[1]
filePath = G_PATHif '/'== fileName:
filePath += './index.html'else:
filePath += fileNametry:file = Nonefile =open(filePath,'r',encoding='gbk')
responseBody = file.read()
responseLine = 'HTTP/1.1 200 OK' + os.linesep
responseHeader = 'Server: ererbai' + os.linesep
responseHeader += 'Date:%s' % time.ctime() + os.linesep
except FileNotFoundError:
responseLine = 'HTTP/1.1 404 NOT FOUND' + os.linesep
responseHeader = 'Server: ererbai' + os.linesep
responseHeader += 'Date:%s' % time.ctime() + os.linesep
responseBody = '很抱歉,服务器中找不到你想要的内容'
except Exception:
responseLine = 'HTTP/1.1 500 ERROR' + os.linesep
responseHeader = 'Server: ererbai' + os.linesep
responseHeader += 'Date: %s' % time.ctime() + os.linesep
responseBody = '服务器正在维护中,请稍后再试。'finally:if file!=None and not file.closed:file.close()
senData = (responseLine + responseHeader + os.linesep + responseBody).encode('gbk')
clientSocket.send(senData)
clientSocket.close()
def main():
serveSocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
serveSocket.bind(('',8000))
serveSocket.listen()while True:
clientSocket,clientAddr = serveSocket.accept()
print(clientSocket)
multiprocessing.Process(target=serveHandler,args=(clientSocket,clientAddr)).start()
clientSocket.close()if __name__ == '__main__':
main()
登入後複製

用戶端瀏覽器首頁

客戶端瀏覽器biye.html頁面#

學習過程中遇到什麼問題或想取得學習資源的話,歡迎加入學習交流群組
343599877,我們一起學習前端!
import time,multiprocessing,socket,os,re G_PATH = './html' def serveHandler(clientSocket,clientAddr): recvData = clientSocket.recv(1024).decode('gbk') lineFirst = recvData.splitlines()[0] strFirst = re.split(r' +',lineFirst) fileName = strFirst[1] filePath = G_PATHif '/'== fileName: filePath += './index.html'else: filePath += fileNametry:file = Nonefile =open(filePath,'r',encoding='gbk') responseBody = file.read() responseLine = 'HTTP/1.1 200 OK' + os.linesep responseHeader = 'Server: ererbai' + os.linesep responseHeader += 'Date:%s' % time.ctime() + os.linesep except FileNotFoundError: responseLine = 'HTTP/1.1 404 NOT FOUND' + os.linesep responseHeader = 'Server: ererbai' + os.linesep responseHeader += 'Date:%s' % time.ctime() + os.linesep responseBody = '很抱歉,服务器中找不到你想要的内容' except Exception: responseLine = 'HTTP/1.1 500 ERROR' + os.linesep responseHeader = 'Server: ererbai' + os.linesep responseHeader += 'Date: %s' % time.ctime() + os.linesep responseBody = '服务器正在维护中,请稍后再试。'finally:if file!=None and not file.closed:file.close() senData = (responseLine + responseHeader + os.linesep + responseBody).encode('gbk') clientSocket.send(senData) clientSocket.close() def main(): serveSocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM) serveSocket.bind(('',8000)) serveSocket.listen()while True: clientSocket,clientAddr = serveSocket.accept() print(clientSocket) multiprocessing.Process(target=serveHandler,args=(clientSocket,clientAddr)).start() clientSocket.close()if __name__ == '__main__': main()

用戶端瀏覽器首頁

客戶端瀏覽器biye.html頁面#

學習過程中遇到什麼問題或想取得學習資源的話,歡迎加入學習交流群組
343599877,我們一起學習前端!
以上是web伺服器的具體介紹的詳細內容。更多資訊請關注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)

解決方法:1、檢查電驢設置,確保已輸入正確的伺服器位址和連接埠號碼;2、檢查網路連接,確保電腦已連接到互聯網,並重置路由器;3、檢查伺服器是否在線,如果您的設定和網路連線都沒有問題,則需要檢查伺服器是否在線上;4、更新電驢版本,造訪電驢官方網站,下載最新版本的電驢軟體;5、尋求協助。

RPC伺服器不可用進不了桌面怎麼辦近年來,電腦和網路已經深入到我們的生活中的各個角落。作為一種集中運算和資源共享的技術,遠端過程呼叫(RPC)在網路通訊中起著至關重要的作用。然而,有時我們可能會遇到RPC伺服器無法使用的情況,導致無法進入桌面。本文將介紹一些可能導致此問題的原因,並提供解決方案。首先,我們需要了解RPC伺服器不可用的原因。 RPC伺服器是一種

身為LINUX用戶,我們經常需要在CentOS上安裝各種軟體和伺服器,本文將詳細介紹如何在CentOS上安裝fuse和建置伺服器的過程,幫助您順利完成相關操作。 CentOS安裝fuseFuse是一個使用者空間檔案系統框架,允許非特權使用者透過自訂檔案系統實現對檔案系統的存取和操作,在CentOS上安裝fuse非常簡單,只需按照以下步驟操作:1.開啟終端,以root用戶登入。 2.使用下列指令安裝fuse軟體包:```yuminstallfuse3.確認安裝過程中的提示,輸入`y`繼續。 4.安裝完

DHCP中繼的作用是將接收到的DHCP封包轉送到網路上的另一個DHCP伺服器,即使這兩台伺服器位於不同的子網路中。透過使用DHCP中繼,您可以實現在網路中心部署集中式的DHCP伺服器,並利用它為所有網路子網路/VLAN動態分配IP位址。 Dnsmasq是一種常用的DNS和DHCP協定伺服器,可設定為DHCP中繼伺服器,以協助管理網路中的動態主機設定。在本文中,我們將向您展示如何將dnsmasq配置為DHCP中繼伺服器。內容主題:網路拓樸在DHCP中繼上設定靜態IP位址集中式DHCP伺服器上的D

在網路資料傳輸中,IP代理伺服器扮演著重要的角色,能夠幫助使用者隱藏真實IP位址,保護隱私、提升存取速度等。在本篇文章中,將介紹如何用PHP建立IP代理伺服器的最佳實務指南,並提供具體的程式碼範例。什麼是IP代理伺服器? IP代理伺服器是位於使用者與目標伺服器之間的中間伺服器,它可作為使用者與目標伺服器之間的中轉站,將使用者的請求和回應轉發。透過使用IP代理伺服器

epic伺服器離線進不了遊戲怎麼辦?這個問題想必很多小夥伴都有遇過,出現了此提示就是導致正版的遊戲無法啟動,那麼出現這個問題一般是網絡和安全軟體幹擾導致的,那麼應該怎麼解決呢,本期小編就來和大夥分享解決方法,希望今日的軟體教學可以幫助各位解決問題。 epic伺服器離線進不了遊戲怎麼辦: 1、很可能是被安全軟體幹擾了,將遊戲平台和安全軟體關閉在重啟。 2、其次就是網路波動過大,嘗試重啟一次路由器,看看是否有效,如果條件可以的話,可以嘗試使用5g移動網絡來進行操作。 3、然後有可能是更

Cockpit是一個面向Linux伺服器的基於Web的圖形介面。它主要是為了使新用戶/專家用戶更容易管理Linux伺服器。在本文中,我們將討論Cockpit存取模式以及如何從CockpitWebUI切換Cockpit的管理存取。內容主題:駕駛艙進入模式查找當前駕駛艙訪問模式從CockpitWebUI啟用Cockpit的管理訪問從CockpitWebUI禁用Cockpit的管理訪問結論駕駛艙進入模式駕駛艙有兩種訪問模式:受限訪問:這是駕駛艙的默認訪問模式。在這種存取模式下,您無法從駕駛艙Web用戶

如何在伺服器上安裝PHPFFmpeg擴充功能?在伺服器上安裝PHPFFmpeg擴充功能可以幫助我們在PHP專案中處理音視訊文件,實現音視訊文件的編解碼、剪輯、處理等功能。本文將介紹如何在伺服器上安裝PHPFFmpeg擴展,以及具體的程式碼範例。首先,我們需要確保伺服器上已經安裝了PHP以及FFmpeg。如果沒有安裝FFmpeg,可以依照下列步驟安裝FFmpe
