[英]Basic webserver using sockets in python
我有以下准系統服務器,以確保我能夠接收套接字連接:
import socket
HOST, PORT = '', 8888
listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
listen_socket.bind((HOST, PORT))
listen_socket.listen(1)
print(f'Serving HTTP on port {PORT} ...')
while True:
print ('1 - start')
client_connection, client_address = listen_socket.accept()
request_data = client_connection.recv(1024)
print(request_data.decode('utf-8'))
client_connection.sendall(b"""HTTP/1.1 200 OK\n\nHello, World!\n""")
client_connection.close()
print ('2 - end')
當我在 Chrome 中查看它時,它會加載頁面,但不返回任何響應。 這是服務器打印的內容:
1 - start
GET / HTTP/1.1
Host: localhost:8888
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site: none
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Cookie: csrftoken=ekiwd2n8m6BjVe0Uoyif6OZ7pmWmULDs; _xsrf=2|02c4087f|7e8be522d7bb6404ace2d2117e42deed|1571691550; username-localhost-8888="2|1:0|10:1571694083|23:username-localhost-8888|44:ODk2NzY4Yzg2ZjgyNDRlMzg0ZWEwMjU1MGQ0OTU5NzE=|87587a46d228990c91d93d828c44e2a79155d03332047321e1f882dced5c67dd"; _hp2_id.1263915336=%7B%22userId%22%3A%223410356020127146%22%2C%22pageviewId%22%3A%223017774512831795%22%2C%22sessionId%22%3A%228642071851852288%22%2C%22identity%22%3Anull%2C%22trackerVersion%22%3A%224.0%22%
2 - end
1 - start
所以它似乎正在經歷......但客戶端(Chrome)只收到一個空白響應:
為什么它不返回“Hello, World”? ? 當我用telnet
嘗試它時,它也是一樣的。
請注意,這與requests
有關——只是不是telnet
或chrome
:
>>> print(requests.get('http://127.0.0.1:8888').text)
Hello, World!
它似乎與這條線有關:
request_data = client_connection.recv(1024)
正如您所說,問題可能是瀏覽器發送超過 1024 個字節時。
此示例使用while True
循環讀取塊並檢查request_data
是否以b'\r\n\r\n'
結尾 - 它適用於GET
但問題是POST
直接在b'\r\n\r\n'
。 為了解決這個問題,我只需使用.recv(1)
並在每個字節后檢查b'\r\n\r\n'
但您可以嘗試找到更好的方法來檢查b'\r\n\r\n'
request_data
import socket
HOST, PORT = '', 8888
listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
listen_socket.bind((HOST, PORT))
listen_socket.listen(1)
print(f'Serving HTTP on port {PORT} ...')
while True:
print ('1 - start')
client_connection, client_address = listen_socket.accept()
request_data = b''
while True:
chunk = client_connection.recv(1)
request_data += chunk
#print(chunk)
if request_data.endswith(b'\r\n\r\n'):
break
print(request_data.decode('utf-8'))
client_connection.sendall(b"""HTTP/1.1 200 OK\n\nHello, World!\n""")
client_connection.close()
print ('2 - end')
此代碼僅讀取 header。 要在POST
中讀取正文,您可以在recv()
中使用具有較大值的 function 並且POST
應該發送 header content-length
和正文大小,因此應該更容易閱讀正文然后 Z099FB995346F31C749F6E40EDB
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.