Python, BaseHTTPRequestHandler:如何从套接字读取文件中的内容?

0 投票
1 回答
1395 浏览
提问于 2025-04-16 08:23

我正在使用Python的BaseHTTPRequestHandler类来搭建一个网络服务器。我想添加一个WebSocket的接口。这意味着我需要从处理器的rfile中读取可用的数据,这样我才能逐条处理接收到的消息,而不是一次性读取所有输入。

我尝试了不同的'read'组合(比如使用一个大缓冲区,想着如果可用数据少就能提前返回;或者不传参数,这样就意味着读取到文件结束为止),但都没有成功。

我想到两种解决方案:

  • 调用read(1):逐字节读取。我不太想这样做,因为我不确定缓冲的具体行为(比如,我不想每读取一个字节就进行一次系统调用)。

  • 暂时将文件设置为非阻塞模式,然后尝试读取一块数据,再将其设置为阻塞模式,然后再尝试读取1个字节。这看起来有点麻烦。还有一个选择是使用非阻塞套接字,但这似乎和我当前的多线程框架不太兼容。

有没有什么办法可以让read返回所有可用的数据呢?

1 个回答

1

WebSockets 不是 HTTP,所以你不能用处理 HTTP 请求的方式来处理它们。

不过,如果你用 BaseHTTPRequestHandler 来处理 HTTP 请求,通常你只会读取你预期的确切数据量(比如在 Content-length 这个头信息里指定的量)。

撰写回答