社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

python中纯套接字上的http服务器

Alex Q. • 5 年前 • 587 次点击  

我试图用python编写非常简单的http服务器。工作版本如下:

def run(self, host='localhost',port=8000):
    with socket.socket(socket.AF_INET,socket.SOCK_STREAM) as s:
        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        s.bind((host,port))
        s.listen(1)
        while True:
            connection, adress = s.accept()
            with connection:
                data = b''
                while True:
                    recived = connection.recv(1024)
                    data += recived
                    if len(recived) < 1024:
                        break

                if data != b'':
                    handle_request(data,connection)

这很管用,但我有点误会。 据我所知,socket“s”接受来自客户端的连接->并返回新的socket对象“connection”,从中我可以读取客户端发送给我的内容并发送响应。我从连接读取数据,直到客户端发送空行B''。在此之后,TCP部分结束,我将接收的字节传递给处理程序,处理程序将接收的数据解析为HTTP。

qestions:此时,我读取了客户端发送给我的所有数据,但是如果我想限制http请求的最大大小,我应该这样做:

..................................

    with connection:
        data = b''
        request_size_limit=1024*100 # some desired http request max size
        while True:
            recived = connection.recv(1024)
            data += recived
            if len(recived) < 1024 or len(data) > request_size_limit:
                break             
            if data != b'':
                handle_request(data,connection)
  1. 如果我这样做,我如何通知客户机,例如,我有最多1024*1024个可用的内存字节,我不能处理比这更大的请求?
  2. 如果客户想发送更多的这个限制,他必须发送几个分开的请求,将包含1部分必要的数据?
  3. 例如,对于大POST请求,我必须解析每个ReV(1024),而我发现\r\n\r\n序列,将内容长度和ReCVE()内容长度由1024b部分检查到一些文件中,然后继续进行?
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/46332
 
587 次点击  
文章 [ 1 ]  |  最新文章 5 年前
Cupcake Protocol
Reply   •   1 楼
Cupcake Protocol    6 年前

A1)如果由于请求太大而无法处理,请考虑关闭连接。或者,您可以读取(并丢弃)它们发送的所有内容,然后用413请求进行响应。

A2)你需要制定一个协议,每次只发送一部分请求。http并不是以本机的方式实现这一点。

A3)如果你能将整个请求分成块读取并保存到一个文件中,那么听起来你有一个1024*1024内存限制的解决方案,不是吗?

但要解决从套接字读取分块数据的问题。