我正在制作一個 httpServer。當客戶端進入時localhost:8888/good.html,他會被路由到相應的頁面。
讓我感到困惑的是我的 css response( res_for_style) 一直處于未決狀態。請讓我知道我哪里出錯了。
服務器.py
import socket
import json
import sys
import threading
pars = ('127.0.0.1', 8888)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(pars)
s.listen(5)
res_for_good = '''HTTP/1.1 200 OK
Content-Type: text/html
<head>
<link rel="stylesheet" href="./style.css" type="text/css">
</head>
<html>
<body>good HaHa</body>
</html>
'''
res_for_style='''HTTP/1.1 200 OK
Content-Type: text/css
body{
color: red;
}
'''
def serveClient(clientsocket, address):
while True:
data = clientsocket.recv(1024)
data_utf8=data.decode('utf-8').split('\r\n')
if '/good.html' in data_utf8[0]:
clientsocket.sendall(res_for_good.encode())
if '/style.css' in data_utf8[0]:
print("transfer css")
res="Content-Type: text/css\n\n" css_file.read()
clientsocket.sendall(res_for_style.encode())
if data == b'':
clientsocket.close()
break
while True:
(clientsocket, address) = s.accept()
threading.Thread(target = serveClient, args = (clientsocket, address)).start()
uj5u.com熱心網友回復:
正如您已經注意到的那樣,clientsocket.close()將解決您的問題。
其背后的原因如下:
HTTP 使用 TCP 連接,它代表一個恒定的訊息流。HTTP 協議定義了訊息的結構。這種結構需要達成一致;否則,就不可能進行有益的交流。
訊息本身分為兩部分,標題和正文。雖然正文攜帶有效載荷(HTML、CSS 或其他任何內容),但標頭包含有關以下有效載荷的必要元資料。標題的一個例子是Content-Type: text/css您已經使用的。
要知道接收到的 body 是否已經完全傳輸,接收者有兩種選擇: 檢查接收到的 body 的長度是否與Content-Length頭部定義的 body 預期 body 的長度匹配。如果Content-Length缺少標頭,則知道傳輸是否完成的唯一方法是檢查發件人是否已關閉連接。如果兩種情況都沒有發生,則客戶端假定服務器將發送更多資訊并繼續等待。
這就是關閉套接字可以解決您的問題的原因。
注意:HTTP 比我剛剛描述的行為復雜得多。例如,有分塊的回應,其作業方式與描述的方式不同。更不用說keep-alive。有關更多參考,請參閱此問題或閱讀檔案。
我認為構建一個簡單的 HTTP 服務器是一個很好的學習體驗。但是我建議你使用一個框架,比如 Flask 或 Django,如果你打算在生產中使用它。
uj5u.com熱心網友回復:
我發現我可以通過添加clientsocket.close()每個while回圈來解決它,但我仍然不知道為什么。
def serveClient(clientsocket, address):
while True:
data = clientsocket.recv(1024)
data_utf8=data.decode('utf-8').split('\r\n')
if '/good.html' in data_utf8[0]:
clientsocket.sendall(res_for_good.encode())
if '/style.css' in data_utf8[0]:
print("transfer css")
res="Content-Type: text/css\n\n" css_file.read()
clientsocket.sendall(res_for_style.encode())
clientsocket.close() #I find that I can solve it by adding this line
if data == b'':
clientsocket.close()
break
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/368147.html
上一篇:FlutterHttp包中如何傳遞["SomeInfo1","SomeInfo2"]
下一篇:從C中的雙向鏈接串列中洗掉特定項
