ホームページ  >  記事  >  バックエンド開発  >  Python を使用して簡単な HTTP サーバーを作成するにはどうすればよいですか?

Python を使用して簡単な HTTP サーバーを作成するにはどうすればよいですか?

王林
王林転載
2023-05-07 22:25:061692ブラウズ

http

httpTCP/IP4 層のトランスポート層をベースとしています。ネットワーク プロトコル TCPアプリケーション層プロトコル。

まあ、4 層モデルは大まかに次のとおりです。

Python を使用して簡単な HTTP サーバーを作成するにはどうすればよいですか?

ネットワーク通信では、ユーザー データはメッセージで送信されますが、実際の通信中は、各層はパケットをカプセル化してセグメント、データグラム、フレームを形成し、最終的にビット ストリーム (バイナリ) として送信し、ターゲット ホストに到着した後、各層は逆アセンブルされて最終メッセージが得られます。

httpこれは最上層、つまりアプリケーション層にあります。

httpそれはどれくらい近いですか?今ご覧の記事でも httphttpHypertext

理解するのは難しいですが、気にしないで読み続けてください。

http リクエスト メッセージとレスポンス メッセージの形式の分析

上記の紹介を通じて、httphttp

httpメッセージは、開始行、ヘッダー行、空白行、エンティティの 4 つの部分で構成されます。 \r\nCRLF

実際のメッセージを見てみましょう。

linuxcurl -v URL

コマンド:

curl -v http://juejin.cn

リクエスト情報:

Python を使用して簡単な HTTP サーバーを作成するにはどうすればよいですか?

出力結果の >

リクエスト メッセージの形式は次のとおりです。

Python を使用して簡単な HTTP サーバーを作成するにはどうすればよいですか?

リクエスト行では、httpGETPOSTHEADURL、最後に CRLF

複数のヘッダー行があり、(フィールド名:値) の形式で表示されます。各ヘッダー行も

CRLF

次に空行があります。空白行は

httphttp://juejin.cn## を使用します。 # 例 、フォームに記入して見てください:

Python を使用して簡単な HTTP サーバーを作成するにはどうすればよいですか?上記は、

curlhttp:// juejin.cnGET/HTTP/1.1User-Agent
HostAccept応答メッセージの形式は次のとおりです。

Python を使用して簡単な HTTP サーバーを作成するにはどうすればよいですか?応答メッセージと要求メッセージを比較すると、最初の行を除いてそれを見つけるのは難しくありません。 , その他 形式は同じなので、応答行の情報のみを紹介します. 応答行の最初の行はプロトコルバージョンであり、サーバーのプロトコルバージョンであり、次にステータスコードを使用して通知されますサーバーの応答情報はフレーズで終わります。このフレーズの機能は、返された情報がおそらく何を意味するかをユーザーに知らせることです。

わかりました。

juejin.cn

Python を使用して簡単な HTTP サーバーを作成するにはどうすればよいですか?curlhttp://juejin.cn/http# が示されています。 ##バージョンは HTTP/1.1、ステータス コードは 301、フレーズはリンクが転送されました。 上記のステータス コードだけを使用した場合、メッセージ全体の意味を 理解することは困難ですが、フレーズを使用すると、それを推測することができます。

首部行,告知了我们服务器 、时间 、 报文类型 以及 报文长度。还记得我们第一段落介绍过得,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__ == '__main__'
    main()

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

Python を使用して簡単な HTTP サーバーを作成するにはどうすればよいですか?

我们得到请求报文后,可以构建一个响应报文发送回去,例如: 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__ == '__main__':
    main()

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

Python を使用して簡単な HTTP サーバーを作成するにはどうすればよいですか?

以上がPython を使用して簡単な HTTP サーバーを作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。