Python, BaseHTTPRequestHandler:如何从套接字读取文件中的内容?
我正在使用Python的BaseHTTPRequestHandler类来搭建一个网络服务器。我想添加一个WebSocket的接口。这意味着我需要从处理器的rfile中读取可用的数据,这样我才能逐条处理接收到的消息,而不是一次性读取所有输入。
我尝试了不同的'read'组合(比如使用一个大缓冲区,想着如果可用数据少就能提前返回;或者不传参数,这样就意味着读取到文件结束为止),但都没有成功。
我想到两种解决方案:
调用read(1):逐字节读取。我不太想这样做,因为我不确定缓冲的具体行为(比如,我不想每读取一个字节就进行一次系统调用)。
暂时将文件设置为非阻塞模式,然后尝试读取一块数据,再将其设置为阻塞模式,然后再尝试读取1个字节。这看起来有点麻烦。还有一个选择是使用非阻塞套接字,但这似乎和我当前的多线程框架不太兼容。
有没有什么办法可以让read返回所有可用的数据呢?
1 个回答
1
WebSockets 不是 HTTP,所以你不能用处理 HTTP 请求的方式来处理它们。
不过,如果你用 BaseHTTPRequestHandler 来处理 HTTP 请求,通常你只会读取你预期的确切数据量(比如在 Content-length 这个头信息里指定的量)。