http
TCP/IP4 層のトランスポート層をベースとしています。ネットワーク プロトコル TCP
アプリケーション層プロトコル。
まあ、4 層モデルは大まかに次のとおりです。
ネットワーク通信では、ユーザー データはメッセージで送信されますが、実際の通信中は、各層はパケットをカプセル化してセグメント、データグラム、フレームを形成し、最終的にビット ストリーム (バイナリ) として送信し、ターゲット ホストに到着した後、各層は逆アセンブルされて最終メッセージが得られます。
http
これは最上層、つまりアプリケーション層にあります。
http
それはどれくらい近いですか?今ご覧の記事でも http
httpHypertext
理解するのは難しいですが、気にしないで読み続けてください。
上記の紹介を通じて、http
http
http
メッセージは、開始行、ヘッダー行、空白行、エンティティの 4 つの部分で構成されます。 \r\n
CRLF
実際のメッセージを見てみましょう。
linux
curl -v URL
コマンド:
curl -v http://juejin.cn
リクエスト情報:
出力結果の >
<
リクエスト メッセージの形式は次のとおりです。
リクエスト行では、http
GET、POST
、HEAD
URL、最後に CRLF
CRLF
httphttp://juejin.cn## を使用します。 # 例 、フォームに記入して見てください:
上記は、
curlhttp:// juejin.cnGET/HTTP/1.1User-Agent、Host
、Accept
応答メッセージの形式は次のとおりです。
応答メッセージと要求メッセージを比較すると、最初の行を除いてそれを見つけるのは難しくありません。 , その他 形式は同じなので、応答行の情報のみを紹介します. 応答行の最初の行はプロトコルバージョンであり、サーバーのプロトコルバージョンであり、次にステータスコードを使用して通知されますサーバーの応答情報はフレーズで終わります。このフレーズの機能は、返された情報がおそらく何を意味するかをユーザーに知らせることです。
わかりました。
juejin.cncurl
http://juejin.cn/http# が示されています。 ##バージョンは HTTP/1.1、ステータス コードは
301、フレーズはリンクが転送されました。
上記のステータス コードだけを使用した場合、メッセージ全体の意味を
理解することは困難ですが、フレーズを使用すると、それを推測することができます。
首部行,告知了我们服务器 、时间 、 报文类型 以及 报文长度。还记得我们第一段落介绍过得,http
现在除了发送超文本以外,还可以发送图片、视频等,就是通过首部行Content-Type
来确定的。
接着是空白行,最后是报文主体,哎,有没有感觉奇怪呢?为什么请求报文主体是空的呢?这是因为报文主体长度是由首部行Content-Length
来定义的,如上报文展示的是,我们报文主体有262个字符。
上述,我们介绍了,什么是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
请求一下该接口,我们将会得到请求报文了,如下:
我们得到请求报文后,可以构建一个响应报文发送回去,例如: 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 サーバーを作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。