簡體   English   中英

在 python 中使用 sockets 的基本網絡服務器

[英]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有關——只是不是telnetchrome

>>> 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM