Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menulis pelayan HTTP mudah menggunakan Python?

Bagaimana untuk menulis pelayan HTTP mudah menggunakan Python?

王林
王林ke hadapan
2023-05-07 22:25:061751semak imbas

Apakah itu http?

httpTCP/IPprotokol lapisan aplikasi dalam lapisan pengangkutan TCPrangkaian 4 lapisan. protokol.

Nah, model 4 lapisan lebih kurang seperti ini:

Bagaimana untuk menulis pelayan HTTP mudah menggunakan Python?

Dalam komunikasi rangkaian, data pengguna dihantar dalam mesej, tetapi dalam keadaan sebenar Semasa komunikasi, setiap lapisan akan merangkum paket untuk membentuk segmen, datagram dan bingkai, dan akhirnya menghantarnya sebagai aliran bit (perduaan).

httpIa berada di lapisan atas, iaitu lapisan aplikasi.

httpSejauh manakah ia dekat dengan kita? Malah artikel yang anda lihat sekarang menggunakan protokol httphttpHypertext

Sukar untuk difahami, tidak mengapa, teruskan membaca.

Analisis http permintaan mesej dan format mesej respons

Melalui pengenalan di atas, kita tahu bahawa httphttp.

httpMesej terdiri daripada 4 bahagian iaitu baris permulaan, baris pengepala, baris kosong dan entiti. Pisahkan dengan rnCRLF).

Mari kita lihat mesej sebenar.

Dalam linux, kami boleh menggunakan curl -v 网址

Arahan:

curl -v http://juejin.cn

Minta maklumat:

Bagaimana untuk menulis pelayan HTTP mudah menggunakan Python?

Dalam hasil output, > Mewakili maklumat respons yang dihantar kepada kami oleh pelayan. Seterusnya kita akan melihat maklumat data di atas bersama-sama dengan mesej.

Format mesej permintaan adalah seperti berikut:

Bagaimana untuk menulis pelayan HTTP mudah menggunakan Python?

Persatuan yang meminta menentukan kaedah permintaan http, seperti: GET, POST, HEAD, dsb., URLhttpCRLF.

CRLF
).

Kemudian terdapat baris kosong. Baris kosong bermakna httphttp://juejin.cn:

<.>

Bagaimana untuk menulis pelayan HTTP mudah menggunakan Python?

Di atas ialah bentuk keseluruhan curlhttp://juejin.cnGET
, dan kemudian ia membawa tiga baris pengepala, iaitu /, HTTP/1.1User-Agent. HostAcceptFormat mesej respons adalah seperti berikut:

Bagaimana untuk menulis pelayan HTTP mudah menggunakan Python?Membandingkan mesej respons dan mesej permintaan, tidak sukar untuk mencarinya kecuali baris pertama , lain Formatnya adalah sama, jadi kami hanya memperkenalkan maklumat baris respons Dalam baris respons, yang pertama ialah versi protokol, iaitu versi protokol pelayan, dan kemudian kod status digunakan untuk memaklumkan. klien. Maklumat respons pelayan diakhiri dengan frasa Fungsi frasa adalah untuk memberitahu pengguna maksud maklumat yang dikembalikan.

Baiklah, jom isi juejin.cn

Bagaimana untuk menulis pelayan HTTP mudah menggunakan Python?Di atas adalah yang kami gunakan

Permintaan

, mari kita lihat maklumat yang dikembalikan oleh pelayan baris demi baris Baris respons memberitahu kita bahawa versi curlhttp://juejin.cn/, kod status ialah httpHTTP/1.1301Jika kita hanya menggunakan kod status di atas, sukar untuk

首部行,告知了我们服务器 、时间 、 报文类型 以及 报文长度。还记得我们第一段落介绍过得,http现在除了发送超文本以外,还可以发送图片、视频等,就是通过首部行Content-Type来确定的。

接着是空白行,最后是报文主体,哎,有没有感觉奇怪呢?为什么请求报文主体是空的呢?这是因为报文主体长度是由首部行Content-Length来定义的,如上报文展示的是,我们报文主体有262个字符。

手写一个简单的http服务器

上述,我们介绍了,什么是http以及初略的看了一下 http的请求报文和响应报文,那么,我们如何构建一个http服务器呢?

我们知道,http是应用层协议,是基于传输层tcp来实现的,所以,我们若想构建一个http服务器,那么应该写一个socket程序出来吧。

import socket
import threading

def handle(client , addr):
    print("from " , addr)
    data = client.recv(1024)
    for k,v in enumerate(data.decode().split("\r\n")):
        print(k ,v)

def main():
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.bind(("127.0.0.1",8080))
    s.listen()
    
    while True:
        client , addr = s.accept() 
        t = threading.Thread(target=handle,args=(client,addr))
        t.start()

if __name__ == &#39;__main__&#39;
    main()

上述,我们写了一个tcp程序,它将监听本地回环地址的8080端口,若此时我们使用curl -v 127.0.0.1:8080请求一下该接口,我们将会得到请求报文了,如下:

Bagaimana untuk menulis pelayan HTTP mudah menggunakan Python?

我们得到请求报文后,可以构建一个响应报文发送回去,例如: Hello, Destined Person.,我们就可以这样来构建http

import socket
import threading

def handle(client , addr):
    print("from " , addr)
    data = client.recv(1024)
    
    #请求报文
    for k,v in enumerate(data. decode() .split("\r\n")):
        print(k ,v)
        
    bodyText = "He1lo,Destined Person."
    #响应报文
    #响应行
    client.send(b"HTTP/1.1 200 OK\r\n")
    #首部行
    client. send(b"Server: pdudo_web_sites\r\n") 
    client. send(b"Content-Type: text/html\r\n")
    client. send(("Content-Length: %s\r\n" % (len(bodyText) + 2)).encode())
    client. send(b"\r\n")
    client. send(("%s\r\n" %(bodyText)).encode())
    
def main():
    try:
        s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        s .bind(("127.0.0.1"8080))
        s .listen()
        
        while True:
            client,addr = s.accept()
            t = threading.Thread(target=handle,args=(client,addr))
            t.start()
    finally:
        s.close()

if __name__ == &#39;__main__&#39;:
    main()

最后我们使用curl再来测试一下,是可以得到消息的。

Bagaimana untuk menulis pelayan HTTP mudah menggunakan Python?

Atas ialah kandungan terperinci Bagaimana untuk menulis pelayan HTTP mudah menggunakan Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam