Maison >interface Web >tutoriel HTML >Présentation détaillée du serveur Web
HTTP est l'abréviation de Hyper Text Transfer Protocol. Son développement est le résultat de la coopération entre le World Wide Web Consortium et l'Internet Engineering Task Force (IETF), qui ont finalement publié une série de RFC (RFC 1945) définissant la version HTTP/1.0. La plus connue d’entre elles est la RFC 2616. La RFC 2616 définit une version couramment utilisée aujourd'hui : HTTP 1.1.
Le protocole HTTP (HyperText Transfer Protocol, Hypertext Transfer Protocol) est un protocole de transfert utilisé pour transférer l'hypertexte du serveur WWW vers le navigateur local. Cela peut rendre le navigateur plus efficace et réduire la transmission réseau. Il garantit non seulement que l'ordinateur transmet correctement et rapidement les documents hypertextes, mais détermine également quelle partie du document est transmise et quelle partie du contenu est affichée en premier (comme le texte avant les graphiques), etc.
HTTP est un protocole de communication basé sur TCP/IP pour transférer des données (fichiers HTML, fichiers images, résultats de requêtes, etc.).
HTTP est un protocole de couche application, composé de requêtes et de réponses, et est un modèle client-serveur standard.
HTTP est un protocole sans état.
![Échec du téléchargement de la compréhension approfondie du protocole HTTP.jpg Veuillez réessayer.]
Cela limite l'utilisation du protocole HTTP, et il est impossible pour le serveur de transmettre des messages au client lorsque celui-ci n'initie pas de requête.
Le protocole HTTP est un protocole sans état. Il n'y a aucune correspondance entre cette requête et la dernière requête du même client.
On peut correspondre aux opérations CRUD d'ajout, de suppression, de modification et de requête de la base de données :
CREATE : PUT
LECTURE : GET
MISE À JOUR : POST
DELETE : DELETE
Points de réponse HTTP Pour les deux parties : Header et Body (Body est facultatif), les lignes les plus importantes du Header que nous voyons dans le réseau sont les suivantes :
HTTP/1.1 200 OK
200 indique une réponse réussie , et le OK suivant est illustré.
Si la valeur renvoyée n'est pas 200, il existe souvent d'autres fonctions, telles que
La réponse échouée est 404 Not Found : la page Web n'existe pas
500 Erreur interne du serveur : Erreur interne du serveur
...etc...
Content-Type : text/html
Content-Type indique le contenu de la réponse, ici text/html représente une page Web HTML.
Lorsque le navigateur lit le code source HTML de la page d'accueil de Sina, il analysera le HTML, affichera la page, puis, en fonction des différents liens contenus dans le HTML. , Envoyez une requête HTTP au serveur Sina, obtenez les images, vidéos, Flash, scripts JavaScript, CSS et autres ressources correspondants, et enfin affichez une page complète.
En suivant la page d'accueil de Sina, résumons le processus de requête HTTP :
Méthode : GET ou POST, GET demande uniquement des ressources, POST sera accompagné des données utilisateur ; > Nom de domaine : spécifié par l'en-tête de l'hôte : Hôte : www.sina.com
et autres en-têtes associés
S'il s'agit d'un POST, la demande comprend également un corps, y compris les données utilisateur
Étape ; 2 : Serveur Renvoie une réponse HTTP au navigateur. La réponse comprend :
et autres en-têtes associés
Habituellement, la réponse HTTP du serveur contient du contenu, c'est-à-dire qu'il existe un corps contenant le le contenu de la réponse et le code source HTML de la page Web se trouve dans le Body .
Étape 3 : Si le navigateur doit continuer à demander d'autres ressources au serveur, telles que des images, effectuez une autre requête HTTP et répétez les étapes 1 et 2.
Format 2.HTTP
GET /path HTTP/1.1
En-tête1 : Valeur1
En-tête2 : Valeur2
En-tête3 : Valeur3
Chaque en-tête est une ligne et le caractère de nouvelle ligne est rn ou Le format de la requête HTTP POST avec os.linesep
:
POST /path HTTP/1.1
Header1 : Value1
Header2 : Value2
Header3 : Value3
body data va ici...
Format de réponse HTTP :
200 OK
En-tête1 : Valeur1
En-tête2 : Valeur2
En-tête3 : Valeur3
les données du corps vont ici...
Veuillez noter encore une fois que le type de données du Body est déterminé par l'en-tête Content-Type. S'il s'agit d'une page Web, le Body est du texte. S'il s'agit d'une image, le Body est les données binaires de l'image.
Lorsque Content-Encoding existe, les données Body sont compressées. La méthode de compression la plus courante est gzip. Par conséquent, lorsque vous voyez Content-Encoding : gzip, vous devez d'abord décompresser les données Body pour obtenir les données réelles. Le but de la compression est de réduire la taille du corps et d'accélérer la transmission sur le réseau.
4Serveur statique Web
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()
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!